@cantoo/fontkit 2.0.5 → 2.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-module.d.ts +239 -0
- package/dist/browser-module.mjs +4423 -1117
- package/dist/browser-module.mjs.map +1 -1
- package/dist/browser.cjs +4424 -1117
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.ts +239 -0
- package/dist/fontkit.umd.d.ts +239 -0
- package/dist/fontkit.umd.js +22076 -0
- package/dist/fontkit.umd.js.map +7 -0
- package/dist/index.d.ts +239 -0
- package/dist/main.cjs +4424 -1117
- package/dist/main.cjs.map +1 -1
- package/dist/main.d.ts +239 -0
- package/dist/module.d.ts +239 -0
- package/dist/module.mjs +4423 -1117
- package/dist/module.mjs.map +1 -1
- package/package.json +22 -5
- package/src/CmapProcessor.js +59 -20
- package/src/DFont.js +114 -14
- package/src/TTFFont.js +259 -57
- package/src/TrueTypeCollection.js +54 -10
- package/src/WOFF2Font.js +128 -16
- package/src/WOFFFont.js +45 -8
- package/src/aat/AATFeatureMap.js +62 -18
- package/src/aat/AATLayoutEngine.js +33 -1
- package/src/aat/AATLookupTable.js +22 -4
- package/src/aat/AATMorxProcessor.js +189 -52
- package/src/aat/AATStateMachine.js +32 -0
- package/src/base.js +19 -0
- package/src/cff/CFFCharsets.js +3 -0
- package/src/cff/CFFDict.js +79 -9
- package/src/cff/CFFEncodings.js +2 -0
- package/src/cff/CFFFont.js +119 -23
- package/src/cff/CFFIndex.js +62 -5
- package/src/cff/CFFOperand.js +52 -17
- package/src/cff/CFFPointer.js +41 -2
- package/src/cff/CFFPrivateDict.js +14 -4
- package/src/cff/CFFStandardStrings.js +1 -0
- package/src/cff/CFFTop.js +103 -10
- package/src/decorators.js +32 -13
- package/src/encodings.js +22 -5
- package/src/fs.js +10 -0
- package/src/glyph/BBox.js +14 -0
- package/src/glyph/CFFGlyph.js +290 -148
- package/src/glyph/COLRGlyph.js +38 -3
- package/src/glyph/Glyph.js +68 -9
- package/src/glyph/GlyphVariationProcessor.js +135 -34
- package/src/glyph/Path.js +107 -20
- package/src/glyph/SBIXGlyph.js +57 -8
- package/src/glyph/StandardNames.js +1 -0
- package/src/glyph/TTFGlyph.js +176 -29
- package/src/glyph/TTFGlyphEncoder.js +32 -0
- package/src/glyph/WOFF2Glyph.js +23 -4
- package/src/layout/GlyphPosition.js +6 -0
- package/src/layout/GlyphRun.js +25 -7
- package/src/layout/KernProcessor.js +62 -3
- package/src/layout/LayoutEngine.js +86 -12
- package/src/layout/Script.js +27 -1
- package/src/layout/UnicodeLayoutEngine.js +29 -4
- package/src/opentype/GPOSProcessor.js +156 -45
- package/src/opentype/GSUBProcessor.js +92 -33
- package/src/opentype/GlyphInfo.js +52 -4
- package/src/opentype/GlyphIterator.js +51 -2
- package/src/opentype/OTLayoutEngine.js +66 -8
- package/src/opentype/OTProcessor.js +283 -70
- package/src/opentype/ShapingPlan.js +51 -3
- package/src/opentype/shapers/ArabicShaper.js +19 -0
- package/src/opentype/shapers/DefaultShaper.js +51 -7
- package/src/opentype/shapers/HangulShaper.js +85 -7
- package/src/opentype/shapers/HebrewShaper.js +45 -11
- package/src/opentype/shapers/IndicShaper.js +141 -26
- package/src/opentype/shapers/ThaiShaper.js +35 -4
- package/src/opentype/shapers/UniversalShaper.js +83 -17
- package/src/opentype/shapers/index.js +15 -2
- package/src/packages/unicode-properties/data-trie.js +1 -0
- package/src/packages/unicode-properties/data.js +12 -0
- package/src/packages/unicode-properties/dist/index.cjs +22 -9
- package/src/packages/unicode-properties/dist/index.cjs.map +2 -2
- package/src/packages/unicode-properties/dist/index.mjs +21 -9
- package/src/packages/unicode-properties/dist/index.mjs.map +2 -2
- package/src/packages/unicode-properties/index.js +65 -0
- package/src/packages/unicode-properties/package.json +1 -1
- package/src/packages/unicode-trie/builder.js +128 -7
- package/src/packages/unicode-trie/dist/builder.cjs +129 -16
- package/src/packages/unicode-trie/dist/builder.cjs.map +2 -2
- package/src/packages/unicode-trie/dist/builder.mjs +128 -16
- package/src/packages/unicode-trie/dist/builder.mjs.map +2 -2
- package/src/packages/unicode-trie/dist/index.cjs +22 -9
- package/src/packages/unicode-trie/dist/index.cjs.map +2 -2
- package/src/packages/unicode-trie/dist/index.mjs +21 -9
- package/src/packages/unicode-trie/dist/index.mjs.map +2 -2
- package/src/packages/unicode-trie/index.js +62 -10
- package/src/packages/unicode-trie/package.json +1 -1
- package/src/packages/unicode-trie/swap.js +13 -0
- package/src/subset/CFFSubset.js +112 -22
- package/src/subset/Subset.js +21 -1
- package/src/subset/TTFSubset.js +79 -36
- package/src/tables/BASE.js +1 -0
- package/src/tables/COLR.js +1 -0
- package/src/tables/CPAL.js +1 -0
- package/src/tables/DSIG.js +1 -0
- package/src/tables/EBDT.js +10 -3
- package/src/tables/EBLC.js +67 -7
- package/src/tables/GDEF.js +1 -0
- package/src/tables/GPOS.js +79 -16
- package/src/tables/GSUB.js +14 -3
- package/src/tables/HVAR.js +51 -5
- package/src/tables/JSTF.js +3 -2
- package/src/tables/LTSH.js +1 -0
- package/src/tables/OS2.js +1 -0
- package/src/tables/PCLT.js +1 -0
- package/src/tables/STAT.js +46 -6
- package/src/tables/VDMX.js +1 -0
- package/src/tables/VORG.js +1 -0
- package/src/tables/WOFF2Directory.js +56 -8
- package/src/tables/WOFFDirectory.js +14 -2
- package/src/tables/aat.js +160 -35
- package/src/tables/avar.js +1 -0
- package/src/tables/bsln.js +3 -2
- package/src/tables/cmap.js +26 -6
- package/src/tables/cvt.js +1 -0
- package/src/tables/directory.js +44 -16
- package/src/tables/feat.js +24 -2
- package/src/tables/fpgm.js +1 -0
- package/src/tables/fvar.js +32 -4
- package/src/tables/gasp.js +1 -0
- package/src/tables/glyf.js +1 -0
- package/src/tables/gvar.js +29 -2
- package/src/tables/hdmx.js +12 -1
- package/src/tables/head.js +1 -0
- package/src/tables/hhea.js +1 -0
- package/src/tables/hmtx.js +18 -2
- package/src/tables/index.js +1 -0
- package/src/tables/just.js +15 -4
- package/src/tables/kern.js +43 -6
- package/src/tables/loca.js +21 -8
- package/src/tables/maxp.js +1 -0
- package/src/tables/morx.js +14 -7
- package/src/tables/name.js +104 -23
- package/src/tables/opbd.js +2 -1
- package/src/tables/opentype.js +39 -4
- package/src/tables/post.js +8 -1
- package/src/tables/prep.js +1 -0
- package/src/tables/sbix.js +12 -1
- package/src/tables/variations.js +23 -3
- package/src/tables/vhea.js +1 -0
- package/src/tables/vmtx.js +18 -2
- package/src/utils.js +15 -0
- package/types/assets.d.ts +13 -0
- package/types/deps.d.ts +83 -0
- package/types/fontkit.d.ts +1324 -0
- package/types/index.d.ts +239 -0
- package/types/restructure.d.ts +354 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../node_modules/fast-deep-equal/index.js", "../node_modules/dfa/src/StateMachine.js", "../node_modules/clone/clone.js", "../node_modules/brotli/dec/streams.js", "../node_modules/brotli/dec/bit_reader.js", "../node_modules/base64-js/index.js", "../node_modules/brotli/dec/dictionary.bin.js", "../node_modules/brotli/dec/dictionary-browser.js", "../node_modules/brotli/dec/dictionary.js", "../node_modules/brotli/dec/huffman.js", "../node_modules/brotli/dec/context.js", "../node_modules/brotli/dec/prefix.js", "../node_modules/brotli/dec/transform.js", "../node_modules/brotli/dec/decode.js", "../node_modules/brotli/decompress.js", "../src/index.js", "../node_modules/restructure/src/DecodeStream.js", "../node_modules/restructure/src/EncodeStream.js", "../node_modules/restructure/src/Base.js", "../node_modules/restructure/src/Number.js", "../node_modules/restructure/src/utils.js", "../node_modules/restructure/src/Array.js", "../node_modules/restructure/src/LazyArray.js", "../node_modules/restructure/src/Bitfield.js", "../node_modules/restructure/src/Buffer.js", "../node_modules/restructure/src/Optional.js", "../node_modules/restructure/src/Reserved.js", "../node_modules/restructure/src/String.js", "../node_modules/restructure/src/Struct.js", "../node_modules/restructure/src/VersionedStruct.js", "../node_modules/restructure/src/Pointer.js", "../src/base.js", "../src/decorators.js", "../src/tables/cmap.js", "../src/tables/head.js", "../src/tables/hhea.js", "../src/tables/hmtx.js", "../src/tables/maxp.js", "../src/encodings.js", "../src/tables/name.js", "../src/tables/OS2.js", "../src/tables/post.js", "../src/tables/cvt.js", "../src/tables/fpgm.js", "../src/tables/loca.js", "../src/tables/prep.js", "../src/tables/glyf.js", "../src/cff/CFFDict.js", "../src/cff/CFFOperand.js", "../src/cff/CFFIndex.js", "../src/cff/CFFPointer.js", "../src/cff/CFFPrivateDict.js", "../src/cff/CFFEncodings.js", "../src/cff/CFFCharsets.js", "../src/tables/opentype.js", "../src/tables/variations.js", "../src/cff/CFFTop.js", "../src/cff/CFFStandardStrings.js", "../src/cff/CFFFont.js", "../src/tables/VORG.js", "../src/tables/EBDT.js", "../src/tables/EBLC.js", "../src/tables/sbix.js", "../src/tables/COLR.js", "../src/tables/CPAL.js", "../src/tables/BASE.js", "../src/tables/GDEF.js", "../src/tables/GPOS.js", "../src/tables/GSUB.js", "../src/tables/JSTF.js", "../src/tables/HVAR.js", "../src/tables/DSIG.js", "../src/tables/gasp.js", "../src/tables/hdmx.js", "../src/tables/kern.js", "../src/tables/LTSH.js", "../src/tables/STAT.js", "../src/tables/PCLT.js", "../src/tables/VDMX.js", "../src/tables/vhea.js", "../src/tables/vmtx.js", "../src/tables/avar.js", "../src/tables/aat.js", "../src/tables/bsln.js", "../src/tables/feat.js", "../src/tables/fvar.js", "../src/tables/gvar.js", "../src/tables/just.js", "../src/tables/morx.js", "../src/tables/opbd.js", "../src/tables/index.js", "../src/tables/directory.js", "../src/utils.js", "../src/CmapProcessor.js", "../src/layout/KernProcessor.js", "../node_modules/fflate/esm/browser.js", "../src/packages/unicode-trie/swap.js", "../src/packages/unicode-trie/index.js", "../src/packages/unicode-properties/data.js", "../src/packages/unicode-properties/data-trie.js", "../src/packages/unicode-properties/index.js", "../src/layout/UnicodeLayoutEngine.js", "../src/glyph/BBox.js", "../src/layout/Script.js", "../src/layout/GlyphRun.js", "../src/layout/GlyphPosition.js", "../src/aat/AATFeatureMap.js", "../src/aat/AATLookupTable.js", "../src/aat/AATStateMachine.js", "../src/aat/AATMorxProcessor.js", "../src/aat/AATLayoutEngine.js", "../src/opentype/ShapingPlan.js", "../src/opentype/GlyphIterator.js", "../src/opentype/OTProcessor.js", "../src/opentype/GlyphInfo.js", "../src/opentype/shapers/DefaultShaper.js", "../src/opentype/shapers/ArabicShaper.js", "../src/opentype/shapers/HangulShaper.js", "../src/opentype/shapers/HebrewShaper.js", "../src/opentype/shapers/IndicShaper.js", "../src/opentype/shapers/indic.json", "../src/opentype/shapers/use.json", "../src/opentype/shapers/indic-data.js", "../src/opentype/shapers/ThaiShaper.js", "../src/opentype/shapers/UniversalShaper.js", "../src/opentype/shapers/index.js", "../src/opentype/GSUBProcessor.js", "../src/opentype/GPOSProcessor.js", "../src/opentype/OTLayoutEngine.js", "../src/layout/LayoutEngine.js", "../src/glyph/Path.js", "../src/glyph/StandardNames.js", "../src/glyph/Glyph.js", "../src/glyph/TTFGlyph.js", "../src/glyph/CFFGlyph.js", "../src/glyph/SBIXGlyph.js", "../src/glyph/COLRGlyph.js", "../src/glyph/CBDTGlyph.js", "../src/glyph/GlyphVariationProcessor.js", "../src/subset/TTFSubset.js", "../src/subset/Subset.js", "../src/glyph/TTFGlyphEncoder.js", "../src/subset/CFFSubset.js", "../src/TTFFont.js", "../src/tables/WOFFDirectory.js", "../src/WOFFFont.js", "../src/WOFF2Font.js", "../src/glyph/WOFF2Glyph.js", "../src/tables/WOFF2Directory.js", "../src/TrueTypeCollection.js", "../src/DFont.js"],
|
|
4
|
+
"sourcesContent": ["'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n for (i = length; i-- !== 0;) {\n var key = keys[i];\n\n if (!equal(a[key], b[key])) return false;\n }\n\n return true;\n }\n\n // true if both NaN, false otherwise\n return a!==a && b!==b;\n};\n", "const INITIAL_STATE = 1;\nconst FAIL_STATE = 0;\n\n/**\n * A StateMachine represents a deterministic finite automaton.\n * It can perform matches over a sequence of values, similar to a regular expression.\n */\nexport default class StateMachine {\n constructor(dfa) {\n this.stateTable = dfa.stateTable;\n this.accepting = dfa.accepting;\n this.tags = dfa.tags;\n }\n\n /**\n * Returns an iterable object that yields pattern matches over the input sequence.\n * Matches are of the form [startIndex, endIndex, tags].\n */\n match(str) {\n let self = this;\n return {\n *[Symbol.iterator]() {\n let state = INITIAL_STATE;\n let startRun = null;\n let lastAccepting = null;\n let lastState = null;\n\n for (let p = 0; p < str.length; p++) {\n let c = str[p];\n\n lastState = state;\n state = self.stateTable[state][c];\n\n if (state === FAIL_STATE) {\n // yield the last match if any\n if (startRun != null && lastAccepting != null && lastAccepting >= startRun) {\n yield [startRun, lastAccepting, self.tags[lastState]];\n }\n\n // reset the state as if we started over from the initial state\n state = self.stateTable[INITIAL_STATE][c];\n startRun = null;\n }\n\n // start a run if not in the failure state\n if (state !== FAIL_STATE && startRun == null) {\n startRun = p;\n }\n\n // if accepting, mark the potential match end\n if (self.accepting[state]) {\n lastAccepting = p;\n }\n\n // reset the state to the initial state if we get into the failure state\n if (state === FAIL_STATE) {\n state = INITIAL_STATE;\n }\n }\n\n // yield the last match if any\n if (startRun != null && lastAccepting != null && lastAccepting >= startRun) {\n yield [startRun, lastAccepting, self.tags[state]];\n }\n }\n };\n }\n\n /**\n * For each match over the input sequence, action functions matching\n * the tag definitions in the input pattern are called with the startIndex,\n * endIndex, and sub-match sequence.\n */\n apply(str, actions) {\n for (let [start, end, tags] of this.match(str)) {\n for (let tag of tags) {\n if (typeof actions[tag] === 'function') {\n actions[tag](start, end, str.slice(start, end + 1));\n }\n }\n }\n }\n}\n", "var clone = (function() {\n'use strict';\n\nfunction _instanceof(obj, type) {\n return type != null && obj instanceof type;\n}\n\nvar nativeMap;\ntry {\n nativeMap = Map;\n} catch(_) {\n // maybe a reference error because no `Map`. Give it a dummy value that no\n // value will ever be an instanceof.\n nativeMap = function() {};\n}\n\nvar nativeSet;\ntry {\n nativeSet = Set;\n} catch(_) {\n nativeSet = function() {};\n}\n\nvar nativePromise;\ntry {\n nativePromise = Promise;\n} catch(_) {\n nativePromise = function() {};\n}\n\n/**\n * Clones (copies) an Object using deep copying.\n *\n * This function supports circular references by default, but if you are certain\n * there are no circular references in your object, you can save some CPU time\n * by calling clone(obj, false).\n *\n * Caution: if `circular` is false and `parent` contains circular references,\n * your program may enter an infinite loop and crash.\n *\n * @param `parent` - the object to be cloned\n * @param `circular` - set to true if the object to be cloned may contain\n * circular references. (optional - true by default)\n * @param `depth` - set to a number if the object is only to be cloned to\n * a particular depth. (optional - defaults to Infinity)\n * @param `prototype` - sets the prototype to be used when cloning an object.\n * (optional - defaults to parent prototype).\n * @param `includeNonEnumerable` - set to true if the non-enumerable properties\n * should be cloned as well. Non-enumerable properties on the prototype\n * chain will be ignored. (optional - false by default)\n*/\nfunction clone(parent, circular, depth, prototype, includeNonEnumerable) {\n if (typeof circular === 'object') {\n depth = circular.depth;\n prototype = circular.prototype;\n includeNonEnumerable = circular.includeNonEnumerable;\n circular = circular.circular;\n }\n // maintain two arrays for circular references, where corresponding parents\n // and children have the same index\n var allParents = [];\n var allChildren = [];\n\n var useBuffer = typeof Buffer != 'undefined';\n\n if (typeof circular == 'undefined')\n circular = true;\n\n if (typeof depth == 'undefined')\n depth = Infinity;\n\n // recurse this function so we don't reset allParents and allChildren\n function _clone(parent, depth) {\n // cloning null always returns null\n if (parent === null)\n return null;\n\n if (depth === 0)\n return parent;\n\n var child;\n var proto;\n if (typeof parent != 'object') {\n return parent;\n }\n\n if (_instanceof(parent, nativeMap)) {\n child = new nativeMap();\n } else if (_instanceof(parent, nativeSet)) {\n child = new nativeSet();\n } else if (_instanceof(parent, nativePromise)) {\n child = new nativePromise(function (resolve, reject) {\n parent.then(function(value) {\n resolve(_clone(value, depth - 1));\n }, function(err) {\n reject(_clone(err, depth - 1));\n });\n });\n } else if (clone.__isArray(parent)) {\n child = [];\n } else if (clone.__isRegExp(parent)) {\n child = new RegExp(parent.source, __getRegExpFlags(parent));\n if (parent.lastIndex) child.lastIndex = parent.lastIndex;\n } else if (clone.__isDate(parent)) {\n child = new Date(parent.getTime());\n } else if (useBuffer && Buffer.isBuffer(parent)) {\n if (Buffer.allocUnsafe) {\n // Node.js >= 4.5.0\n child = Buffer.allocUnsafe(parent.length);\n } else {\n // Older Node.js versions\n child = new Buffer(parent.length);\n }\n parent.copy(child);\n return child;\n } else if (_instanceof(parent, Error)) {\n child = Object.create(parent);\n } else {\n if (typeof prototype == 'undefined') {\n proto = Object.getPrototypeOf(parent);\n child = Object.create(proto);\n }\n else {\n child = Object.create(prototype);\n proto = prototype;\n }\n }\n\n if (circular) {\n var index = allParents.indexOf(parent);\n\n if (index != -1) {\n return allChildren[index];\n }\n allParents.push(parent);\n allChildren.push(child);\n }\n\n if (_instanceof(parent, nativeMap)) {\n parent.forEach(function(value, key) {\n var keyChild = _clone(key, depth - 1);\n var valueChild = _clone(value, depth - 1);\n child.set(keyChild, valueChild);\n });\n }\n if (_instanceof(parent, nativeSet)) {\n parent.forEach(function(value) {\n var entryChild = _clone(value, depth - 1);\n child.add(entryChild);\n });\n }\n\n for (var i in parent) {\n var attrs;\n if (proto) {\n attrs = Object.getOwnPropertyDescriptor(proto, i);\n }\n\n if (attrs && attrs.set == null) {\n continue;\n }\n child[i] = _clone(parent[i], depth - 1);\n }\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(parent);\n for (var i = 0; i < symbols.length; i++) {\n // Don't need to worry about cloning a symbol because it is a primitive,\n // like a number or string.\n var symbol = symbols[i];\n var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);\n if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {\n continue;\n }\n child[symbol] = _clone(parent[symbol], depth - 1);\n if (!descriptor.enumerable) {\n Object.defineProperty(child, symbol, {\n enumerable: false\n });\n }\n }\n }\n\n if (includeNonEnumerable) {\n var allPropertyNames = Object.getOwnPropertyNames(parent);\n for (var i = 0; i < allPropertyNames.length; i++) {\n var propertyName = allPropertyNames[i];\n var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);\n if (descriptor && descriptor.enumerable) {\n continue;\n }\n child[propertyName] = _clone(parent[propertyName], depth - 1);\n Object.defineProperty(child, propertyName, {\n enumerable: false\n });\n }\n }\n\n return child;\n }\n\n return _clone(parent, depth);\n}\n\n/**\n * Simple flat clone using prototype, accepts only objects, usefull for property\n * override on FLAT configuration object (no nested props).\n *\n * USE WITH CAUTION! This may not behave as you wish if you do not know how this\n * works.\n */\nclone.clonePrototype = function clonePrototype(parent) {\n if (parent === null)\n return null;\n\n var c = function () {};\n c.prototype = parent;\n return new c();\n};\n\n// private utility functions\n\nfunction __objToStr(o) {\n return Object.prototype.toString.call(o);\n}\nclone.__objToStr = __objToStr;\n\nfunction __isDate(o) {\n return typeof o === 'object' && __objToStr(o) === '[object Date]';\n}\nclone.__isDate = __isDate;\n\nfunction __isArray(o) {\n return typeof o === 'object' && __objToStr(o) === '[object Array]';\n}\nclone.__isArray = __isArray;\n\nfunction __isRegExp(o) {\n return typeof o === 'object' && __objToStr(o) === '[object RegExp]';\n}\nclone.__isRegExp = __isRegExp;\n\nfunction __getRegExpFlags(re) {\n var flags = '';\n if (re.global) flags += 'g';\n if (re.ignoreCase) flags += 'i';\n if (re.multiline) flags += 'm';\n return flags;\n}\nclone.__getRegExpFlags = __getRegExpFlags;\n\nreturn clone;\n})();\n\nif (typeof module === 'object' && module.exports) {\n module.exports = clone;\n}\n", "function BrotliInput(buffer) {\n this.buffer = buffer;\n this.pos = 0;\n}\n\nBrotliInput.prototype.read = function(buf, i, count) {\n if (this.pos + count > this.buffer.length) {\n count = this.buffer.length - this.pos;\n }\n \n for (var p = 0; p < count; p++)\n buf[i + p] = this.buffer[this.pos + p];\n \n this.pos += count;\n return count;\n}\n\nexports.BrotliInput = BrotliInput;\n\nfunction BrotliOutput(buf) {\n this.buffer = buf;\n this.pos = 0;\n}\n\nBrotliOutput.prototype.write = function(buf, count) {\n if (this.pos + count > this.buffer.length)\n throw new Error('Output buffer is not large enough');\n \n this.buffer.set(buf.subarray(0, count), this.pos);\n this.pos += count;\n return count;\n};\n\nexports.BrotliOutput = BrotliOutput;\n", "/* Copyright 2013 Google Inc. All Rights Reserved.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n Bit reading helpers\n*/\n\nvar BROTLI_READ_SIZE = 4096;\nvar BROTLI_IBUF_SIZE = (2 * BROTLI_READ_SIZE + 32);\nvar BROTLI_IBUF_MASK = (2 * BROTLI_READ_SIZE - 1);\n\nvar kBitMask = new Uint32Array([\n 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767,\n 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215\n]);\n\n/* Input byte buffer, consist of a ringbuffer and a \"slack\" region where */\n/* bytes from the start of the ringbuffer are copied. */\nfunction BrotliBitReader(input) {\n this.buf_ = new Uint8Array(BROTLI_IBUF_SIZE);\n this.input_ = input; /* input callback */\n \n this.reset();\n}\n\nBrotliBitReader.READ_SIZE = BROTLI_READ_SIZE;\nBrotliBitReader.IBUF_MASK = BROTLI_IBUF_MASK;\n\nBrotliBitReader.prototype.reset = function() {\n this.buf_ptr_ = 0; /* next input will write here */\n this.val_ = 0; /* pre-fetched bits */\n this.pos_ = 0; /* byte position in stream */\n this.bit_pos_ = 0; /* current bit-reading position in val_ */\n this.bit_end_pos_ = 0; /* bit-reading end position from LSB of val_ */\n this.eos_ = 0; /* input stream is finished */\n \n this.readMoreInput();\n for (var i = 0; i < 4; i++) {\n this.val_ |= this.buf_[this.pos_] << (8 * i);\n ++this.pos_;\n }\n \n return this.bit_end_pos_ > 0;\n};\n\n/* Fills up the input ringbuffer by calling the input callback.\n\n Does nothing if there are at least 32 bytes present after current position.\n\n Returns 0 if either:\n - the input callback returned an error, or\n - there is no more input and the position is past the end of the stream.\n\n After encountering the end of the input stream, 32 additional zero bytes are\n copied to the ringbuffer, therefore it is safe to call this function after\n every 32 bytes of input is read.\n*/\nBrotliBitReader.prototype.readMoreInput = function() {\n if (this.bit_end_pos_ > 256) {\n return;\n } else if (this.eos_) {\n if (this.bit_pos_ > this.bit_end_pos_)\n throw new Error('Unexpected end of input ' + this.bit_pos_ + ' ' + this.bit_end_pos_);\n } else {\n var dst = this.buf_ptr_;\n var bytes_read = this.input_.read(this.buf_, dst, BROTLI_READ_SIZE);\n if (bytes_read < 0) {\n throw new Error('Unexpected end of input');\n }\n \n if (bytes_read < BROTLI_READ_SIZE) {\n this.eos_ = 1;\n /* Store 32 bytes of zero after the stream end. */\n for (var p = 0; p < 32; p++)\n this.buf_[dst + bytes_read + p] = 0;\n }\n \n if (dst === 0) {\n /* Copy the head of the ringbuffer to the slack region. */\n for (var p = 0; p < 32; p++)\n this.buf_[(BROTLI_READ_SIZE << 1) + p] = this.buf_[p];\n\n this.buf_ptr_ = BROTLI_READ_SIZE;\n } else {\n this.buf_ptr_ = 0;\n }\n \n this.bit_end_pos_ += bytes_read << 3;\n }\n};\n\n/* Guarantees that there are at least 24 bits in the buffer. */\nBrotliBitReader.prototype.fillBitWindow = function() { \n while (this.bit_pos_ >= 8) {\n this.val_ >>>= 8;\n this.val_ |= this.buf_[this.pos_ & BROTLI_IBUF_MASK] << 24;\n ++this.pos_;\n this.bit_pos_ = this.bit_pos_ - 8 >>> 0;\n this.bit_end_pos_ = this.bit_end_pos_ - 8 >>> 0;\n }\n};\n\n/* Reads the specified number of bits from Read Buffer. */\nBrotliBitReader.prototype.readBits = function(n_bits) {\n if (32 - this.bit_pos_ < n_bits) {\n this.fillBitWindow();\n }\n \n var val = ((this.val_ >>> this.bit_pos_) & kBitMask[n_bits]);\n this.bit_pos_ += n_bits;\n return val;\n};\n\nmodule.exports = BrotliBitReader;\n", "'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n", "module.exports=\"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\";\n", "var base64 = require('base64-js');\n\n/**\n * The normal dictionary-data.js is quite large, which makes it \n * unsuitable for browser usage. In order to make it smaller, \n * we read dictionary.bin, which is a compressed version of\n * the dictionary, and on initial load, Brotli decompresses \n * it's own dictionary. \uD83D\uDE1C\n */\nexports.init = function() {\n var BrotliDecompressBuffer = require('./decode').BrotliDecompressBuffer;\n var compressed = base64.toByteArray(require('./dictionary.bin.js'));\n return BrotliDecompressBuffer(compressed);\n};\n", "/* Copyright 2013 Google Inc. All Rights Reserved.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n Collection of static dictionary words.\n*/\n\nvar data = require('./dictionary-data');\nexports.init = function() {\n exports.dictionary = data.init();\n};\n\nexports.offsetsByLength = new Uint32Array([\n 0, 0, 0, 0, 0, 4096, 9216, 21504, 35840, 44032,\n 53248, 63488, 74752, 87040, 93696, 100864, 104704, 106752, 108928, 113536,\n 115968, 118528, 119872, 121280, 122016,\n]);\n\nexports.sizeBitsByLength = new Uint8Array([\n 0, 0, 0, 0, 10, 10, 11, 11, 10, 10,\n 10, 10, 10, 9, 9, 8, 7, 7, 8, 7,\n 7, 6, 6, 5, 5,\n]);\n\nexports.minDictionaryWordLength = 4;\nexports.maxDictionaryWordLength = 24;\n", "function HuffmanCode(bits, value) {\n this.bits = bits; /* number of bits used for this symbol */\n this.value = value; /* symbol value or table offset */\n}\n\nexports.HuffmanCode = HuffmanCode;\n\nvar MAX_LENGTH = 15;\n\n/* Returns reverse(reverse(key, len) + 1, len), where reverse(key, len) is the\n bit-wise reversal of the len least significant bits of key. */\nfunction GetNextKey(key, len) {\n var step = 1 << (len - 1);\n while (key & step) {\n step >>= 1;\n }\n return (key & (step - 1)) + step;\n}\n\n/* Stores code in table[0], table[step], table[2*step], ..., table[end] */\n/* Assumes that end is an integer multiple of step */\nfunction ReplicateValue(table, i, step, end, code) {\n do {\n end -= step;\n table[i + end] = new HuffmanCode(code.bits, code.value);\n } while (end > 0);\n}\n\n/* Returns the table width of the next 2nd level table. count is the histogram\n of bit lengths for the remaining symbols, len is the code length of the next\n processed symbol */\nfunction NextTableBitSize(count, len, root_bits) {\n var left = 1 << (len - root_bits);\n while (len < MAX_LENGTH) {\n left -= count[len];\n if (left <= 0) break;\n ++len;\n left <<= 1;\n }\n return len - root_bits;\n}\n\nexports.BrotliBuildHuffmanTable = function(root_table, table, root_bits, code_lengths, code_lengths_size) {\n var start_table = table;\n var code; /* current table entry */\n var len; /* current code length */\n var symbol; /* symbol index in original or sorted table */\n var key; /* reversed prefix code */\n var step; /* step size to replicate values in current table */\n var low; /* low bits for current root entry */\n var mask; /* mask for low bits */\n var table_bits; /* key length of current table */\n var table_size; /* size of current table */\n var total_size; /* sum of root table size and 2nd level table sizes */\n var sorted; /* symbols sorted by code length */\n var count = new Int32Array(MAX_LENGTH + 1); /* number of codes of each length */\n var offset = new Int32Array(MAX_LENGTH + 1); /* offsets in sorted table for each length */\n\n sorted = new Int32Array(code_lengths_size);\n\n /* build histogram of code lengths */\n for (symbol = 0; symbol < code_lengths_size; symbol++) {\n count[code_lengths[symbol]]++;\n }\n\n /* generate offsets into sorted symbol table by code length */\n offset[1] = 0;\n for (len = 1; len < MAX_LENGTH; len++) {\n offset[len + 1] = offset[len] + count[len];\n }\n\n /* sort symbols by length, by symbol order within each length */\n for (symbol = 0; symbol < code_lengths_size; symbol++) {\n if (code_lengths[symbol] !== 0) {\n sorted[offset[code_lengths[symbol]]++] = symbol;\n }\n }\n \n table_bits = root_bits;\n table_size = 1 << table_bits;\n total_size = table_size;\n\n /* special case code with only one value */\n if (offset[MAX_LENGTH] === 1) {\n for (key = 0; key < total_size; ++key) {\n root_table[table + key] = new HuffmanCode(0, sorted[0] & 0xffff);\n }\n \n return total_size;\n }\n\n /* fill in root table */\n key = 0;\n symbol = 0;\n for (len = 1, step = 2; len <= root_bits; ++len, step <<= 1) {\n for (; count[len] > 0; --count[len]) {\n code = new HuffmanCode(len & 0xff, sorted[symbol++] & 0xffff);\n ReplicateValue(root_table, table + key, step, table_size, code);\n key = GetNextKey(key, len);\n }\n }\n\n /* fill in 2nd level tables and add pointers to root table */\n mask = total_size - 1;\n low = -1;\n for (len = root_bits + 1, step = 2; len <= MAX_LENGTH; ++len, step <<= 1) {\n for (; count[len] > 0; --count[len]) {\n if ((key & mask) !== low) {\n table += table_size;\n table_bits = NextTableBitSize(count, len, root_bits);\n table_size = 1 << table_bits;\n total_size += table_size;\n low = key & mask;\n root_table[start_table + low] = new HuffmanCode((table_bits + root_bits) & 0xff, ((table - start_table) - low) & 0xffff);\n }\n code = new HuffmanCode((len - root_bits) & 0xff, sorted[symbol++] & 0xffff);\n ReplicateValue(root_table, table + (key >> root_bits), step, table_size, code);\n key = GetNextKey(key, len);\n }\n }\n \n return total_size;\n}\n", "/* Copyright 2013 Google Inc. All Rights Reserved.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n Lookup table to map the previous two bytes to a context id.\n\n There are four different context modeling modes defined here:\n CONTEXT_LSB6: context id is the least significant 6 bits of the last byte,\n CONTEXT_MSB6: context id is the most significant 6 bits of the last byte,\n CONTEXT_UTF8: second-order context model tuned for UTF8-encoded text,\n CONTEXT_SIGNED: second-order context model tuned for signed integers.\n\n The context id for the UTF8 context model is calculated as follows. If p1\n and p2 are the previous two bytes, we calcualte the context as\n\n context = kContextLookup[p1] | kContextLookup[p2 + 256].\n\n If the previous two bytes are ASCII characters (i.e. < 128), this will be\n equivalent to\n\n context = 4 * context1(p1) + context2(p2),\n\n where context1 is based on the previous byte in the following way:\n\n 0 : non-ASCII control\n 1 : \\t, \\n, \\r\n 2 : space\n 3 : other punctuation\n 4 : \" '\n 5 : %\n 6 : ( < [ {\n 7 : ) > ] }\n 8 : , ; :\n 9 : .\n 10 : =\n 11 : number\n 12 : upper-case vowel\n 13 : upper-case consonant\n 14 : lower-case vowel\n 15 : lower-case consonant\n\n and context2 is based on the second last byte:\n\n 0 : control, space\n 1 : punctuation\n 2 : upper-case letter, number\n 3 : lower-case letter\n\n If the last byte is ASCII, and the second last byte is not (in a valid UTF8\n stream it will be a continuation byte, value between 128 and 191), the\n context is the same as if the second last byte was an ASCII control or space.\n\n If the last byte is a UTF8 lead byte (value >= 192), then the next byte will\n be a continuation byte and the context id is 2 or 3 depending on the LSB of\n the last byte and to a lesser extent on the second last byte if it is ASCII.\n\n If the last byte is a UTF8 continuation byte, the second last byte can be:\n - continuation byte: the next byte is probably ASCII or lead byte (assuming\n 4-byte UTF8 characters are rare) and the context id is 0 or 1.\n - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1\n - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3\n\n The possible value combinations of the previous two bytes, the range of\n context ids and the type of the next byte is summarized in the table below:\n\n |--------\\-----------------------------------------------------------------|\n | \\ Last byte |\n | Second \\---------------------------------------------------------------|\n | last byte \\ ASCII | cont. byte | lead byte |\n | \\ (0-127) | (128-191) | (192-) |\n |=============|===================|=====================|==================|\n | ASCII | next: ASCII/lead | not valid | next: cont. |\n | (0-127) | context: 4 - 63 | | context: 2 - 3 |\n |-------------|-------------------|---------------------|------------------|\n | cont. byte | next: ASCII/lead | next: ASCII/lead | next: cont. |\n | (128-191) | context: 4 - 63 | context: 0 - 1 | context: 2 - 3 |\n |-------------|-------------------|---------------------|------------------|\n | lead byte | not valid | next: ASCII/lead | not valid |\n | (192-207) | | context: 0 - 1 | |\n |-------------|-------------------|---------------------|------------------|\n | lead byte | not valid | next: cont. | not valid |\n | (208-) | | context: 2 - 3 | |\n |-------------|-------------------|---------------------|------------------|\n\n The context id for the signed context mode is calculated as:\n\n context = (kContextLookup[512 + p1] << 3) | kContextLookup[512 + p2].\n\n For any context modeling modes, the context ids can be calculated by |-ing\n together two lookups from one table using context model dependent offsets:\n\n context = kContextLookup[offset1 + p1] | kContextLookup[offset2 + p2].\n\n where offset1 and offset2 are dependent on the context mode.\n*/\n\nvar CONTEXT_LSB6 = 0;\nvar CONTEXT_MSB6 = 1;\nvar CONTEXT_UTF8 = 2;\nvar CONTEXT_SIGNED = 3;\n\n/* Common context lookup table for all context modes. */\nexports.lookup = new Uint8Array([\n /* CONTEXT_UTF8, last byte. */\n /* ASCII range. */\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12,\n 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12,\n 12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48,\n 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12,\n 12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56,\n 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12, 0,\n /* UTF8 continuation byte range. */\n 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,\n /* UTF8 lead byte range. */\n 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,\n 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,\n 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,\n 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,\n /* CONTEXT_UTF8 second last byte. */\n /* ASCII range. */\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,\n 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,\n 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0,\n /* UTF8 continuation byte range. */\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n /* UTF8 lead byte range. */\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n /* CONTEXT_SIGNED, second last byte. */\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\n 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7,\n /* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */\n 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\n 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,\n 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\n 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,\n 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,\n 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,\n 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,\n 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,\n 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,\n 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,\n 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56,\n /* CONTEXT_LSB6, last byte. */\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,\n 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,\n /* CONTEXT_MSB6, last byte. */\n 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3,\n 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,\n 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11,\n 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,\n 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19,\n 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23,\n 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27,\n 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31,\n 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35,\n 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39,\n 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43,\n 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47,\n 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51,\n 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55,\n 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59,\n 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63,\n /* CONTEXT_{M,L}SB6, second last byte, */\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n]);\n\nexports.lookupOffsets = new Uint16Array([\n /* CONTEXT_LSB6 */\n 1024, 1536,\n /* CONTEXT_MSB6 */\n 1280, 1536,\n /* CONTEXT_UTF8 */\n 0, 256,\n /* CONTEXT_SIGNED */\n 768, 512,\n]);\n", "/* Copyright 2013 Google Inc. All Rights Reserved.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n Lookup tables to map prefix codes to value ranges. This is used during\n decoding of the block lengths, literal insertion lengths and copy lengths.\n*/\n\n/* Represents the range of values belonging to a prefix code: */\n/* [offset, offset + 2^nbits) */\nfunction PrefixCodeRange(offset, nbits) {\n this.offset = offset;\n this.nbits = nbits;\n}\n\nexports.kBlockLengthPrefixCode = [\n new PrefixCodeRange(1, 2), new PrefixCodeRange(5, 2), new PrefixCodeRange(9, 2), new PrefixCodeRange(13, 2),\n new PrefixCodeRange(17, 3), new PrefixCodeRange(25, 3), new PrefixCodeRange(33, 3), new PrefixCodeRange(41, 3),\n new PrefixCodeRange(49, 4), new PrefixCodeRange(65, 4), new PrefixCodeRange(81, 4), new PrefixCodeRange(97, 4),\n new PrefixCodeRange(113, 5), new PrefixCodeRange(145, 5), new PrefixCodeRange(177, 5), new PrefixCodeRange(209, 5),\n new PrefixCodeRange(241, 6), new PrefixCodeRange(305, 6), new PrefixCodeRange(369, 7), new PrefixCodeRange(497, 8),\n new PrefixCodeRange(753, 9), new PrefixCodeRange(1265, 10), new PrefixCodeRange(2289, 11), new PrefixCodeRange(4337, 12),\n new PrefixCodeRange(8433, 13), new PrefixCodeRange(16625, 24)\n];\n\nexports.kInsertLengthPrefixCode = [\n new PrefixCodeRange(0, 0), new PrefixCodeRange(1, 0), new PrefixCodeRange(2, 0), new PrefixCodeRange(3, 0),\n new PrefixCodeRange(4, 0), new PrefixCodeRange(5, 0), new PrefixCodeRange(6, 1), new PrefixCodeRange(8, 1),\n new PrefixCodeRange(10, 2), new PrefixCodeRange(14, 2), new PrefixCodeRange(18, 3), new PrefixCodeRange(26, 3),\n new PrefixCodeRange(34, 4), new PrefixCodeRange(50, 4), new PrefixCodeRange(66, 5), new PrefixCodeRange(98, 5),\n new PrefixCodeRange(130, 6), new PrefixCodeRange(194, 7), new PrefixCodeRange(322, 8), new PrefixCodeRange(578, 9),\n new PrefixCodeRange(1090, 10), new PrefixCodeRange(2114, 12), new PrefixCodeRange(6210, 14), new PrefixCodeRange(22594, 24),\n];\n\nexports.kCopyLengthPrefixCode = [\n new PrefixCodeRange(2, 0), new PrefixCodeRange(3, 0), new PrefixCodeRange(4, 0), new PrefixCodeRange(5, 0),\n new PrefixCodeRange(6, 0), new PrefixCodeRange(7, 0), new PrefixCodeRange(8, 0), new PrefixCodeRange(9, 0),\n new PrefixCodeRange(10, 1), new PrefixCodeRange(12, 1), new PrefixCodeRange(14, 2), new PrefixCodeRange(18, 2),\n new PrefixCodeRange(22, 3), new PrefixCodeRange(30, 3), new PrefixCodeRange(38, 4), new PrefixCodeRange(54, 4),\n new PrefixCodeRange(70, 5), new PrefixCodeRange(102, 5), new PrefixCodeRange(134, 6), new PrefixCodeRange(198, 7),\n new PrefixCodeRange(326, 8), new PrefixCodeRange(582, 9), new PrefixCodeRange(1094, 10), new PrefixCodeRange(2118, 24),\n];\n\nexports.kInsertRangeLut = [\n 0, 0, 8, 8, 0, 16, 8, 16, 16,\n];\n\nexports.kCopyRangeLut = [\n 0, 8, 0, 8, 16, 0, 16, 8, 16,\n];\n", "/* Copyright 2013 Google Inc. All Rights Reserved.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n Transformations on dictionary words.\n*/\n\nvar BrotliDictionary = require('./dictionary');\n\nvar kIdentity = 0;\nvar kOmitLast1 = 1;\nvar kOmitLast2 = 2;\nvar kOmitLast3 = 3;\nvar kOmitLast4 = 4;\nvar kOmitLast5 = 5;\nvar kOmitLast6 = 6;\nvar kOmitLast7 = 7;\nvar kOmitLast8 = 8;\nvar kOmitLast9 = 9;\nvar kUppercaseFirst = 10;\nvar kUppercaseAll = 11;\nvar kOmitFirst1 = 12;\nvar kOmitFirst2 = 13;\nvar kOmitFirst3 = 14;\nvar kOmitFirst4 = 15;\nvar kOmitFirst5 = 16;\nvar kOmitFirst6 = 17;\nvar kOmitFirst7 = 18;\nvar kOmitFirst8 = 19;\nvar kOmitFirst9 = 20;\n\nfunction Transform(prefix, transform, suffix) {\n this.prefix = new Uint8Array(prefix.length);\n this.transform = transform;\n this.suffix = new Uint8Array(suffix.length);\n \n for (var i = 0; i < prefix.length; i++)\n this.prefix[i] = prefix.charCodeAt(i);\n \n for (var i = 0; i < suffix.length; i++)\n this.suffix[i] = suffix.charCodeAt(i);\n}\n\nvar kTransforms = [\n new Transform( \"\", kIdentity, \"\" ),\n new Transform( \"\", kIdentity, \" \" ),\n new Transform( \" \", kIdentity, \" \" ),\n new Transform( \"\", kOmitFirst1, \"\" ),\n new Transform( \"\", kUppercaseFirst, \" \" ),\n new Transform( \"\", kIdentity, \" the \" ),\n new Transform( \" \", kIdentity, \"\" ),\n new Transform( \"s \", kIdentity, \" \" ),\n new Transform( \"\", kIdentity, \" of \" ),\n new Transform( \"\", kUppercaseFirst, \"\" ),\n new Transform( \"\", kIdentity, \" and \" ),\n new Transform( \"\", kOmitFirst2, \"\" ),\n new Transform( \"\", kOmitLast1, \"\" ),\n new Transform( \", \", kIdentity, \" \" ),\n new Transform( \"\", kIdentity, \", \" ),\n new Transform( \" \", kUppercaseFirst, \" \" ),\n new Transform( \"\", kIdentity, \" in \" ),\n new Transform( \"\", kIdentity, \" to \" ),\n new Transform( \"e \", kIdentity, \" \" ),\n new Transform( \"\", kIdentity, \"\\\"\" ),\n new Transform( \"\", kIdentity, \".\" ),\n new Transform( \"\", kIdentity, \"\\\">\" ),\n new Transform( \"\", kIdentity, \"\\n\" ),\n new Transform( \"\", kOmitLast3, \"\" ),\n new Transform( \"\", kIdentity, \"]\" ),\n new Transform( \"\", kIdentity, \" for \" ),\n new Transform( \"\", kOmitFirst3, \"\" ),\n new Transform( \"\", kOmitLast2, \"\" ),\n new Transform( \"\", kIdentity, \" a \" ),\n new Transform( \"\", kIdentity, \" that \" ),\n new Transform( \" \", kUppercaseFirst, \"\" ),\n new Transform( \"\", kIdentity, \". \" ),\n new Transform( \".\", kIdentity, \"\" ),\n new Transform( \" \", kIdentity, \", \" ),\n new Transform( \"\", kOmitFirst4, \"\" ),\n new Transform( \"\", kIdentity, \" with \" ),\n new Transform( \"\", kIdentity, \"'\" ),\n new Transform( \"\", kIdentity, \" from \" ),\n new Transform( \"\", kIdentity, \" by \" ),\n new Transform( \"\", kOmitFirst5, \"\" ),\n new Transform( \"\", kOmitFirst6, \"\" ),\n new Transform( \" the \", kIdentity, \"\" ),\n new Transform( \"\", kOmitLast4, \"\" ),\n new Transform( \"\", kIdentity, \". The \" ),\n new Transform( \"\", kUppercaseAll, \"\" ),\n new Transform( \"\", kIdentity, \" on \" ),\n new Transform( \"\", kIdentity, \" as \" ),\n new Transform( \"\", kIdentity, \" is \" ),\n new Transform( \"\", kOmitLast7, \"\" ),\n new Transform( \"\", kOmitLast1, \"ing \" ),\n new Transform( \"\", kIdentity, \"\\n\\t\" ),\n new Transform( \"\", kIdentity, \":\" ),\n new Transform( \" \", kIdentity, \". \" ),\n new Transform( \"\", kIdentity, \"ed \" ),\n new Transform( \"\", kOmitFirst9, \"\" ),\n new Transform( \"\", kOmitFirst7, \"\" ),\n new Transform( \"\", kOmitLast6, \"\" ),\n new Transform( \"\", kIdentity, \"(\" ),\n new Transform( \"\", kUppercaseFirst, \", \" ),\n new Transform( \"\", kOmitLast8, \"\" ),\n new Transform( \"\", kIdentity, \" at \" ),\n new Transform( \"\", kIdentity, \"ly \" ),\n new Transform( \" the \", kIdentity, \" of \" ),\n new Transform( \"\", kOmitLast5, \"\" ),\n new Transform( \"\", kOmitLast9, \"\" ),\n new Transform( \" \", kUppercaseFirst, \", \" ),\n new Transform( \"\", kUppercaseFirst, \"\\\"\" ),\n new Transform( \".\", kIdentity, \"(\" ),\n new Transform( \"\", kUppercaseAll, \" \" ),\n new Transform( \"\", kUppercaseFirst, \"\\\">\" ),\n new Transform( \"\", kIdentity, \"=\\\"\" ),\n new Transform( \" \", kIdentity, \".\" ),\n new Transform( \".com/\", kIdentity, \"\" ),\n new Transform( \" the \", kIdentity, \" of the \" ),\n new Transform( \"\", kUppercaseFirst, \"'\" ),\n new Transform( \"\", kIdentity, \". This \" ),\n new Transform( \"\", kIdentity, \",\" ),\n new Transform( \".\", kIdentity, \" \" ),\n new Transform( \"\", kUppercaseFirst, \"(\" ),\n new Transform( \"\", kUppercaseFirst, \".\" ),\n new Transform( \"\", kIdentity, \" not \" ),\n new Transform( \" \", kIdentity, \"=\\\"\" ),\n new Transform( \"\", kIdentity, \"er \" ),\n new Transform( \" \", kUppercaseAll, \" \" ),\n new Transform( \"\", kIdentity, \"al \" ),\n new Transform( \" \", kUppercaseAll, \"\" ),\n new Transform( \"\", kIdentity, \"='\" ),\n new Transform( \"\", kUppercaseAll, \"\\\"\" ),\n new Transform( \"\", kUppercaseFirst, \". \" ),\n new Transform( \" \", kIdentity, \"(\" ),\n new Transform( \"\", kIdentity, \"ful \" ),\n new Transform( \" \", kUppercaseFirst, \". \" ),\n new Transform( \"\", kIdentity, \"ive \" ),\n new Transform( \"\", kIdentity, \"less \" ),\n new Transform( \"\", kUppercaseAll, \"'\" ),\n new Transform( \"\", kIdentity, \"est \" ),\n new Transform( \" \", kUppercaseFirst, \".\" ),\n new Transform( \"\", kUppercaseAll, \"\\\">\" ),\n new Transform( \" \", kIdentity, \"='\" ),\n new Transform( \"\", kUppercaseFirst, \",\" ),\n new Transform( \"\", kIdentity, \"ize \" ),\n new Transform( \"\", kUppercaseAll, \".\" ),\n new Transform( \"\\xc2\\xa0\", kIdentity, \"\" ),\n new Transform( \" \", kIdentity, \",\" ),\n new Transform( \"\", kUppercaseFirst, \"=\\\"\" ),\n new Transform( \"\", kUppercaseAll, \"=\\\"\" ),\n new Transform( \"\", kIdentity, \"ous \" ),\n new Transform( \"\", kUppercaseAll, \", \" ),\n new Transform( \"\", kUppercaseFirst, \"='\" ),\n new Transform( \" \", kUppercaseFirst, \",\" ),\n new Transform( \" \", kUppercaseAll, \"=\\\"\" ),\n new Transform( \" \", kUppercaseAll, \", \" ),\n new Transform( \"\", kUppercaseAll, \",\" ),\n new Transform( \"\", kUppercaseAll, \"(\" ),\n new Transform( \"\", kUppercaseAll, \". \" ),\n new Transform( \" \", kUppercaseAll, \".\" ),\n new Transform( \"\", kUppercaseAll, \"='\" ),\n new Transform( \" \", kUppercaseAll, \". \" ),\n new Transform( \" \", kUppercaseFirst, \"=\\\"\" ),\n new Transform( \" \", kUppercaseAll, \"='\" ),\n new Transform( \" \", kUppercaseFirst, \"='\" )\n];\n\nexports.kTransforms = kTransforms;\nexports.kNumTransforms = kTransforms.length;\n\nfunction ToUpperCase(p, i) {\n if (p[i] < 0xc0) {\n if (p[i] >= 97 && p[i] <= 122) {\n p[i] ^= 32;\n }\n return 1;\n }\n \n /* An overly simplified uppercasing model for utf-8. */\n if (p[i] < 0xe0) {\n p[i + 1] ^= 32;\n return 2;\n }\n \n /* An arbitrary transform for three byte characters. */\n p[i + 2] ^= 5;\n return 3;\n}\n\nexports.transformDictionaryWord = function(dst, idx, word, len, transform) {\n var prefix = kTransforms[transform].prefix;\n var suffix = kTransforms[transform].suffix;\n var t = kTransforms[transform].transform;\n var skip = t < kOmitFirst1 ? 0 : t - (kOmitFirst1 - 1);\n var i = 0;\n var start_idx = idx;\n var uppercase;\n \n if (skip > len) {\n skip = len;\n }\n \n var prefix_pos = 0;\n while (prefix_pos < prefix.length) {\n dst[idx++] = prefix[prefix_pos++];\n }\n \n word += skip;\n len -= skip;\n \n if (t <= kOmitLast9) {\n len -= t;\n }\n \n for (i = 0; i < len; i++) {\n dst[idx++] = BrotliDictionary.dictionary[word + i];\n }\n \n uppercase = idx - len;\n \n if (t === kUppercaseFirst) {\n ToUpperCase(dst, uppercase);\n } else if (t === kUppercaseAll) {\n while (len > 0) {\n var step = ToUpperCase(dst, uppercase);\n uppercase += step;\n len -= step;\n }\n }\n \n var suffix_pos = 0;\n while (suffix_pos < suffix.length) {\n dst[idx++] = suffix[suffix_pos++];\n }\n \n return idx - start_idx;\n}\n", "/* Copyright 2013 Google Inc. All Rights Reserved.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n*/\n\nvar BrotliInput = require('./streams').BrotliInput;\nvar BrotliOutput = require('./streams').BrotliOutput;\nvar BrotliBitReader = require('./bit_reader');\nvar BrotliDictionary = require('./dictionary');\nvar HuffmanCode = require('./huffman').HuffmanCode;\nvar BrotliBuildHuffmanTable = require('./huffman').BrotliBuildHuffmanTable;\nvar Context = require('./context');\nvar Prefix = require('./prefix');\nvar Transform = require('./transform');\n\nvar kDefaultCodeLength = 8;\nvar kCodeLengthRepeatCode = 16;\nvar kNumLiteralCodes = 256;\nvar kNumInsertAndCopyCodes = 704;\nvar kNumBlockLengthCodes = 26;\nvar kLiteralContextBits = 6;\nvar kDistanceContextBits = 2;\n\nvar HUFFMAN_TABLE_BITS = 8;\nvar HUFFMAN_TABLE_MASK = 0xff;\n/* Maximum possible Huffman table size for an alphabet size of 704, max code\n * length 15 and root table bits 8. */\nvar HUFFMAN_MAX_TABLE_SIZE = 1080;\n\nvar CODE_LENGTH_CODES = 18;\nvar kCodeLengthCodeOrder = new Uint8Array([\n 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n]);\n\nvar NUM_DISTANCE_SHORT_CODES = 16;\nvar kDistanceShortCodeIndexOffset = new Uint8Array([\n 3, 2, 1, 0, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2\n]);\n\nvar kDistanceShortCodeValueOffset = new Int8Array([\n 0, 0, 0, 0, -1, 1, -2, 2, -3, 3, -1, 1, -2, 2, -3, 3\n]);\n\nvar kMaxHuffmanTableSize = new Uint16Array([\n 256, 402, 436, 468, 500, 534, 566, 598, 630, 662, 694, 726, 758, 790, 822,\n 854, 886, 920, 952, 984, 1016, 1048, 1080\n]);\n\nfunction DecodeWindowBits(br) {\n var n;\n if (br.readBits(1) === 0) {\n return 16;\n }\n \n n = br.readBits(3);\n if (n > 0) {\n return 17 + n;\n }\n \n n = br.readBits(3);\n if (n > 0) {\n return 8 + n;\n }\n \n return 17;\n}\n\n/* Decodes a number in the range [0..255], by reading 1 - 11 bits. */\nfunction DecodeVarLenUint8(br) {\n if (br.readBits(1)) {\n var nbits = br.readBits(3);\n if (nbits === 0) {\n return 1;\n } else {\n return br.readBits(nbits) + (1 << nbits);\n }\n }\n return 0;\n}\n\nfunction MetaBlockLength() {\n this.meta_block_length = 0;\n this.input_end = 0;\n this.is_uncompressed = 0;\n this.is_metadata = false;\n}\n\nfunction DecodeMetaBlockLength(br) {\n var out = new MetaBlockLength; \n var size_nibbles;\n var size_bytes;\n var i;\n \n out.input_end = br.readBits(1);\n if (out.input_end && br.readBits(1)) {\n return out;\n }\n \n size_nibbles = br.readBits(2) + 4;\n if (size_nibbles === 7) {\n out.is_metadata = true;\n \n if (br.readBits(1) !== 0)\n throw new Error('Invalid reserved bit');\n \n size_bytes = br.readBits(2);\n if (size_bytes === 0)\n return out;\n \n for (i = 0; i < size_bytes; i++) {\n var next_byte = br.readBits(8);\n if (i + 1 === size_bytes && size_bytes > 1 && next_byte === 0)\n throw new Error('Invalid size byte');\n \n out.meta_block_length |= next_byte << (i * 8);\n }\n } else {\n for (i = 0; i < size_nibbles; ++i) {\n var next_nibble = br.readBits(4);\n if (i + 1 === size_nibbles && size_nibbles > 4 && next_nibble === 0)\n throw new Error('Invalid size nibble');\n \n out.meta_block_length |= next_nibble << (i * 4);\n }\n }\n \n ++out.meta_block_length;\n \n if (!out.input_end && !out.is_metadata) {\n out.is_uncompressed = br.readBits(1);\n }\n \n return out;\n}\n\n/* Decodes the next Huffman code from bit-stream. */\nfunction ReadSymbol(table, index, br) {\n var start_index = index;\n \n var nbits;\n br.fillBitWindow();\n index += (br.val_ >>> br.bit_pos_) & HUFFMAN_TABLE_MASK;\n nbits = table[index].bits - HUFFMAN_TABLE_BITS;\n if (nbits > 0) {\n br.bit_pos_ += HUFFMAN_TABLE_BITS;\n index += table[index].value;\n index += (br.val_ >>> br.bit_pos_) & ((1 << nbits) - 1);\n }\n br.bit_pos_ += table[index].bits;\n return table[index].value;\n}\n\nfunction ReadHuffmanCodeLengths(code_length_code_lengths, num_symbols, code_lengths, br) {\n var symbol = 0;\n var prev_code_len = kDefaultCodeLength;\n var repeat = 0;\n var repeat_code_len = 0;\n var space = 32768;\n \n var table = [];\n for (var i = 0; i < 32; i++)\n table.push(new HuffmanCode(0, 0));\n \n BrotliBuildHuffmanTable(table, 0, 5, code_length_code_lengths, CODE_LENGTH_CODES);\n\n while (symbol < num_symbols && space > 0) {\n var p = 0;\n var code_len;\n \n br.readMoreInput();\n br.fillBitWindow();\n p += (br.val_ >>> br.bit_pos_) & 31;\n br.bit_pos_ += table[p].bits;\n code_len = table[p].value & 0xff;\n if (code_len < kCodeLengthRepeatCode) {\n repeat = 0;\n code_lengths[symbol++] = code_len;\n if (code_len !== 0) {\n prev_code_len = code_len;\n space -= 32768 >> code_len;\n }\n } else {\n var extra_bits = code_len - 14;\n var old_repeat;\n var repeat_delta;\n var new_len = 0;\n if (code_len === kCodeLengthRepeatCode) {\n new_len = prev_code_len;\n }\n if (repeat_code_len !== new_len) {\n repeat = 0;\n repeat_code_len = new_len;\n }\n old_repeat = repeat;\n if (repeat > 0) {\n repeat -= 2;\n repeat <<= extra_bits;\n }\n repeat += br.readBits(extra_bits) + 3;\n repeat_delta = repeat - old_repeat;\n if (symbol + repeat_delta > num_symbols) {\n throw new Error('[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols');\n }\n \n for (var x = 0; x < repeat_delta; x++)\n code_lengths[symbol + x] = repeat_code_len;\n \n symbol += repeat_delta;\n \n if (repeat_code_len !== 0) {\n space -= repeat_delta << (15 - repeat_code_len);\n }\n }\n }\n if (space !== 0) {\n throw new Error(\"[ReadHuffmanCodeLengths] space = \" + space);\n }\n \n for (; symbol < num_symbols; symbol++)\n code_lengths[symbol] = 0;\n}\n\nfunction ReadHuffmanCode(alphabet_size, tables, table, br) {\n var table_size = 0;\n var simple_code_or_skip;\n var code_lengths = new Uint8Array(alphabet_size);\n \n br.readMoreInput();\n \n /* simple_code_or_skip is used as follows:\n 1 for simple code;\n 0 for no skipping, 2 skips 2 code lengths, 3 skips 3 code lengths */\n simple_code_or_skip = br.readBits(2);\n if (simple_code_or_skip === 1) {\n /* Read symbols, codes & code lengths directly. */\n var i;\n var max_bits_counter = alphabet_size - 1;\n var max_bits = 0;\n var symbols = new Int32Array(4);\n var num_symbols = br.readBits(2) + 1;\n while (max_bits_counter) {\n max_bits_counter >>= 1;\n ++max_bits;\n }\n\n for (i = 0; i < num_symbols; ++i) {\n symbols[i] = br.readBits(max_bits) % alphabet_size;\n code_lengths[symbols[i]] = 2;\n }\n code_lengths[symbols[0]] = 1;\n switch (num_symbols) {\n case 1:\n break;\n case 3:\n if ((symbols[0] === symbols[1]) ||\n (symbols[0] === symbols[2]) ||\n (symbols[1] === symbols[2])) {\n throw new Error('[ReadHuffmanCode] invalid symbols');\n }\n break;\n case 2:\n if (symbols[0] === symbols[1]) {\n throw new Error('[ReadHuffmanCode] invalid symbols');\n }\n \n code_lengths[symbols[1]] = 1;\n break;\n case 4:\n if ((symbols[0] === symbols[1]) ||\n (symbols[0] === symbols[2]) ||\n (symbols[0] === symbols[3]) ||\n (symbols[1] === symbols[2]) ||\n (symbols[1] === symbols[3]) ||\n (symbols[2] === symbols[3])) {\n throw new Error('[ReadHuffmanCode] invalid symbols');\n }\n \n if (br.readBits(1)) {\n code_lengths[symbols[2]] = 3;\n code_lengths[symbols[3]] = 3;\n } else {\n code_lengths[symbols[0]] = 2;\n }\n break;\n }\n } else { /* Decode Huffman-coded code lengths. */\n var i;\n var code_length_code_lengths = new Uint8Array(CODE_LENGTH_CODES);\n var space = 32;\n var num_codes = 0;\n /* Static Huffman code for the code length code lengths */\n var huff = [\n new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(3, 2), \n new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(4, 1),\n new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(3, 2), \n new HuffmanCode(2, 0), new HuffmanCode(2, 4), new HuffmanCode(2, 3), new HuffmanCode(4, 5)\n ];\n for (i = simple_code_or_skip; i < CODE_LENGTH_CODES && space > 0; ++i) {\n var code_len_idx = kCodeLengthCodeOrder[i];\n var p = 0;\n var v;\n br.fillBitWindow();\n p += (br.val_ >>> br.bit_pos_) & 15;\n br.bit_pos_ += huff[p].bits;\n v = huff[p].value;\n code_length_code_lengths[code_len_idx] = v;\n if (v !== 0) {\n space -= (32 >> v);\n ++num_codes;\n }\n }\n \n if (!(num_codes === 1 || space === 0))\n throw new Error('[ReadHuffmanCode] invalid num_codes or space');\n \n ReadHuffmanCodeLengths(code_length_code_lengths, alphabet_size, code_lengths, br);\n }\n \n table_size = BrotliBuildHuffmanTable(tables, table, HUFFMAN_TABLE_BITS, code_lengths, alphabet_size);\n \n if (table_size === 0) {\n throw new Error(\"[ReadHuffmanCode] BuildHuffmanTable failed: \");\n }\n \n return table_size;\n}\n\nfunction ReadBlockLength(table, index, br) {\n var code;\n var nbits;\n code = ReadSymbol(table, index, br);\n nbits = Prefix.kBlockLengthPrefixCode[code].nbits;\n return Prefix.kBlockLengthPrefixCode[code].offset + br.readBits(nbits);\n}\n\nfunction TranslateShortCodes(code, ringbuffer, index) {\n var val;\n if (code < NUM_DISTANCE_SHORT_CODES) {\n index += kDistanceShortCodeIndexOffset[code];\n index &= 3;\n val = ringbuffer[index] + kDistanceShortCodeValueOffset[code];\n } else {\n val = code - NUM_DISTANCE_SHORT_CODES + 1;\n }\n return val;\n}\n\nfunction MoveToFront(v, index) {\n var value = v[index];\n var i = index;\n for (; i; --i) v[i] = v[i - 1];\n v[0] = value;\n}\n\nfunction InverseMoveToFrontTransform(v, v_len) {\n var mtf = new Uint8Array(256);\n var i;\n for (i = 0; i < 256; ++i) {\n mtf[i] = i;\n }\n for (i = 0; i < v_len; ++i) {\n var index = v[i];\n v[i] = mtf[index];\n if (index) MoveToFront(mtf, index);\n }\n}\n\n/* Contains a collection of huffman trees with the same alphabet size. */\nfunction HuffmanTreeGroup(alphabet_size, num_htrees) {\n this.alphabet_size = alphabet_size;\n this.num_htrees = num_htrees;\n this.codes = new Array(num_htrees + num_htrees * kMaxHuffmanTableSize[(alphabet_size + 31) >>> 5]); \n this.htrees = new Uint32Array(num_htrees);\n}\n\nHuffmanTreeGroup.prototype.decode = function(br) {\n var i;\n var table_size;\n var next = 0;\n for (i = 0; i < this.num_htrees; ++i) {\n this.htrees[i] = next;\n table_size = ReadHuffmanCode(this.alphabet_size, this.codes, next, br);\n next += table_size;\n }\n};\n\nfunction DecodeContextMap(context_map_size, br) {\n var out = { num_htrees: null, context_map: null };\n var use_rle_for_zeros;\n var max_run_length_prefix = 0;\n var table;\n var i;\n \n br.readMoreInput();\n var num_htrees = out.num_htrees = DecodeVarLenUint8(br) + 1;\n\n var context_map = out.context_map = new Uint8Array(context_map_size);\n if (num_htrees <= 1) {\n return out;\n }\n\n use_rle_for_zeros = br.readBits(1);\n if (use_rle_for_zeros) {\n max_run_length_prefix = br.readBits(4) + 1;\n }\n \n table = [];\n for (i = 0; i < HUFFMAN_MAX_TABLE_SIZE; i++) {\n table[i] = new HuffmanCode(0, 0);\n }\n \n ReadHuffmanCode(num_htrees + max_run_length_prefix, table, 0, br);\n \n for (i = 0; i < context_map_size;) {\n var code;\n\n br.readMoreInput();\n code = ReadSymbol(table, 0, br);\n if (code === 0) {\n context_map[i] = 0;\n ++i;\n } else if (code <= max_run_length_prefix) {\n var reps = 1 + (1 << code) + br.readBits(code);\n while (--reps) {\n if (i >= context_map_size) {\n throw new Error(\"[DecodeContextMap] i >= context_map_size\");\n }\n context_map[i] = 0;\n ++i;\n }\n } else {\n context_map[i] = code - max_run_length_prefix;\n ++i;\n }\n }\n if (br.readBits(1)) {\n InverseMoveToFrontTransform(context_map, context_map_size);\n }\n \n return out;\n}\n\nfunction DecodeBlockType(max_block_type, trees, tree_type, block_types, ringbuffers, indexes, br) {\n var ringbuffer = tree_type * 2;\n var index = tree_type;\n var type_code = ReadSymbol(trees, tree_type * HUFFMAN_MAX_TABLE_SIZE, br);\n var block_type;\n if (type_code === 0) {\n block_type = ringbuffers[ringbuffer + (indexes[index] & 1)];\n } else if (type_code === 1) {\n block_type = ringbuffers[ringbuffer + ((indexes[index] - 1) & 1)] + 1;\n } else {\n block_type = type_code - 2;\n }\n if (block_type >= max_block_type) {\n block_type -= max_block_type;\n }\n block_types[tree_type] = block_type;\n ringbuffers[ringbuffer + (indexes[index] & 1)] = block_type;\n ++indexes[index];\n}\n\nfunction CopyUncompressedBlockToOutput(output, len, pos, ringbuffer, ringbuffer_mask, br) {\n var rb_size = ringbuffer_mask + 1;\n var rb_pos = pos & ringbuffer_mask;\n var br_pos = br.pos_ & BrotliBitReader.IBUF_MASK;\n var nbytes;\n\n /* For short lengths copy byte-by-byte */\n if (len < 8 || br.bit_pos_ + (len << 3) < br.bit_end_pos_) {\n while (len-- > 0) {\n br.readMoreInput();\n ringbuffer[rb_pos++] = br.readBits(8);\n if (rb_pos === rb_size) {\n output.write(ringbuffer, rb_size);\n rb_pos = 0;\n }\n }\n return;\n }\n\n if (br.bit_end_pos_ < 32) {\n throw new Error('[CopyUncompressedBlockToOutput] br.bit_end_pos_ < 32');\n }\n\n /* Copy remaining 0-4 bytes from br.val_ to ringbuffer. */\n while (br.bit_pos_ < 32) {\n ringbuffer[rb_pos] = (br.val_ >>> br.bit_pos_);\n br.bit_pos_ += 8;\n ++rb_pos;\n --len;\n }\n\n /* Copy remaining bytes from br.buf_ to ringbuffer. */\n nbytes = (br.bit_end_pos_ - br.bit_pos_) >> 3;\n if (br_pos + nbytes > BrotliBitReader.IBUF_MASK) {\n var tail = BrotliBitReader.IBUF_MASK + 1 - br_pos;\n for (var x = 0; x < tail; x++)\n ringbuffer[rb_pos + x] = br.buf_[br_pos + x];\n \n nbytes -= tail;\n rb_pos += tail;\n len -= tail;\n br_pos = 0;\n }\n\n for (var x = 0; x < nbytes; x++)\n ringbuffer[rb_pos + x] = br.buf_[br_pos + x];\n \n rb_pos += nbytes;\n len -= nbytes;\n\n /* If we wrote past the logical end of the ringbuffer, copy the tail of the\n ringbuffer to its beginning and flush the ringbuffer to the output. */\n if (rb_pos >= rb_size) {\n output.write(ringbuffer, rb_size);\n rb_pos -= rb_size; \n for (var x = 0; x < rb_pos; x++)\n ringbuffer[x] = ringbuffer[rb_size + x];\n }\n\n /* If we have more to copy than the remaining size of the ringbuffer, then we\n first fill the ringbuffer from the input and then flush the ringbuffer to\n the output */\n while (rb_pos + len >= rb_size) {\n nbytes = rb_size - rb_pos;\n if (br.input_.read(ringbuffer, rb_pos, nbytes) < nbytes) {\n throw new Error('[CopyUncompressedBlockToOutput] not enough bytes');\n }\n output.write(ringbuffer, rb_size);\n len -= nbytes;\n rb_pos = 0;\n }\n\n /* Copy straight from the input onto the ringbuffer. The ringbuffer will be\n flushed to the output at a later time. */\n if (br.input_.read(ringbuffer, rb_pos, len) < len) {\n throw new Error('[CopyUncompressedBlockToOutput] not enough bytes');\n }\n\n /* Restore the state of the bit reader. */\n br.reset();\n}\n\n/* Advances the bit reader position to the next byte boundary and verifies\n that any skipped bits are set to zero. */\nfunction JumpToByteBoundary(br) {\n var new_bit_pos = (br.bit_pos_ + 7) & ~7;\n var pad_bits = br.readBits(new_bit_pos - br.bit_pos_);\n return pad_bits == 0;\n}\n\nfunction BrotliDecompressedSize(buffer) {\n var input = new BrotliInput(buffer);\n var br = new BrotliBitReader(input);\n DecodeWindowBits(br);\n var out = DecodeMetaBlockLength(br);\n return out.meta_block_length;\n}\n\nexports.BrotliDecompressedSize = BrotliDecompressedSize;\n\nfunction BrotliDecompressBuffer(buffer, output_size) {\n var input = new BrotliInput(buffer);\n \n if (output_size == null) {\n output_size = BrotliDecompressedSize(buffer);\n }\n \n var output_buffer = new Uint8Array(output_size);\n var output = new BrotliOutput(output_buffer);\n \n BrotliDecompress(input, output);\n \n if (output.pos < output.buffer.length) {\n output.buffer = output.buffer.subarray(0, output.pos);\n }\n \n return output.buffer;\n}\n\nexports.BrotliDecompressBuffer = BrotliDecompressBuffer;\n\nfunction BrotliDecompress(input, output) {\n var i;\n var pos = 0;\n var input_end = 0;\n var window_bits = 0;\n var max_backward_distance;\n var max_distance = 0;\n var ringbuffer_size;\n var ringbuffer_mask;\n var ringbuffer;\n var ringbuffer_end;\n /* This ring buffer holds a few past copy distances that will be used by */\n /* some special distance codes. */\n var dist_rb = [ 16, 15, 11, 4 ];\n var dist_rb_idx = 0;\n /* The previous 2 bytes used for context. */\n var prev_byte1 = 0;\n var prev_byte2 = 0;\n var hgroup = [new HuffmanTreeGroup(0, 0), new HuffmanTreeGroup(0, 0), new HuffmanTreeGroup(0, 0)];\n var block_type_trees;\n var block_len_trees;\n var br;\n\n /* We need the slack region for the following reasons:\n - always doing two 8-byte copies for fast backward copying\n - transforms\n - flushing the input ringbuffer when decoding uncompressed blocks */\n var kRingBufferWriteAheadSlack = 128 + BrotliBitReader.READ_SIZE;\n\n br = new BrotliBitReader(input);\n\n /* Decode window size. */\n window_bits = DecodeWindowBits(br);\n max_backward_distance = (1 << window_bits) - 16;\n\n ringbuffer_size = 1 << window_bits;\n ringbuffer_mask = ringbuffer_size - 1;\n ringbuffer = new Uint8Array(ringbuffer_size + kRingBufferWriteAheadSlack + BrotliDictionary.maxDictionaryWordLength);\n ringbuffer_end = ringbuffer_size;\n\n block_type_trees = [];\n block_len_trees = [];\n for (var x = 0; x < 3 * HUFFMAN_MAX_TABLE_SIZE; x++) {\n block_type_trees[x] = new HuffmanCode(0, 0);\n block_len_trees[x] = new HuffmanCode(0, 0);\n }\n\n while (!input_end) {\n var meta_block_remaining_len = 0;\n var is_uncompressed;\n var block_length = [ 1 << 28, 1 << 28, 1 << 28 ];\n var block_type = [ 0 ];\n var num_block_types = [ 1, 1, 1 ];\n var block_type_rb = [ 0, 1, 0, 1, 0, 1 ];\n var block_type_rb_index = [ 0 ];\n var distance_postfix_bits;\n var num_direct_distance_codes;\n var distance_postfix_mask;\n var num_distance_codes;\n var context_map = null;\n var context_modes = null;\n var num_literal_htrees;\n var dist_context_map = null;\n var num_dist_htrees;\n var context_offset = 0;\n var context_map_slice = null;\n var literal_htree_index = 0;\n var dist_context_offset = 0;\n var dist_context_map_slice = null;\n var dist_htree_index = 0;\n var context_lookup_offset1 = 0;\n var context_lookup_offset2 = 0;\n var context_mode;\n var htree_command;\n\n for (i = 0; i < 3; ++i) {\n hgroup[i].codes = null;\n hgroup[i].htrees = null;\n }\n\n br.readMoreInput();\n \n var _out = DecodeMetaBlockLength(br);\n meta_block_remaining_len = _out.meta_block_length;\n if (pos + meta_block_remaining_len > output.buffer.length) {\n /* We need to grow the output buffer to fit the additional data. */\n var tmp = new Uint8Array( pos + meta_block_remaining_len );\n tmp.set( output.buffer );\n output.buffer = tmp;\n } \n input_end = _out.input_end;\n is_uncompressed = _out.is_uncompressed;\n \n if (_out.is_metadata) {\n JumpToByteBoundary(br);\n \n for (; meta_block_remaining_len > 0; --meta_block_remaining_len) {\n br.readMoreInput();\n /* Read one byte and ignore it. */\n br.readBits(8);\n }\n \n continue;\n }\n \n if (meta_block_remaining_len === 0) {\n continue;\n }\n \n if (is_uncompressed) {\n br.bit_pos_ = (br.bit_pos_ + 7) & ~7;\n CopyUncompressedBlockToOutput(output, meta_block_remaining_len, pos,\n ringbuffer, ringbuffer_mask, br);\n pos += meta_block_remaining_len;\n continue;\n }\n \n for (i = 0; i < 3; ++i) {\n num_block_types[i] = DecodeVarLenUint8(br) + 1;\n if (num_block_types[i] >= 2) {\n ReadHuffmanCode(num_block_types[i] + 2, block_type_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);\n ReadHuffmanCode(kNumBlockLengthCodes, block_len_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);\n block_length[i] = ReadBlockLength(block_len_trees, i * HUFFMAN_MAX_TABLE_SIZE, br);\n block_type_rb_index[i] = 1;\n }\n }\n \n br.readMoreInput();\n \n distance_postfix_bits = br.readBits(2);\n num_direct_distance_codes = NUM_DISTANCE_SHORT_CODES + (br.readBits(4) << distance_postfix_bits);\n distance_postfix_mask = (1 << distance_postfix_bits) - 1;\n num_distance_codes = (num_direct_distance_codes + (48 << distance_postfix_bits));\n context_modes = new Uint8Array(num_block_types[0]);\n\n for (i = 0; i < num_block_types[0]; ++i) {\n br.readMoreInput();\n context_modes[i] = (br.readBits(2) << 1);\n }\n \n var _o1 = DecodeContextMap(num_block_types[0] << kLiteralContextBits, br);\n num_literal_htrees = _o1.num_htrees;\n context_map = _o1.context_map;\n \n var _o2 = DecodeContextMap(num_block_types[2] << kDistanceContextBits, br);\n num_dist_htrees = _o2.num_htrees;\n dist_context_map = _o2.context_map;\n \n hgroup[0] = new HuffmanTreeGroup(kNumLiteralCodes, num_literal_htrees);\n hgroup[1] = new HuffmanTreeGroup(kNumInsertAndCopyCodes, num_block_types[1]);\n hgroup[2] = new HuffmanTreeGroup(num_distance_codes, num_dist_htrees);\n\n for (i = 0; i < 3; ++i) {\n hgroup[i].decode(br);\n }\n\n context_map_slice = 0;\n dist_context_map_slice = 0;\n context_mode = context_modes[block_type[0]];\n context_lookup_offset1 = Context.lookupOffsets[context_mode];\n context_lookup_offset2 = Context.lookupOffsets[context_mode + 1];\n htree_command = hgroup[1].htrees[0];\n\n while (meta_block_remaining_len > 0) {\n var cmd_code;\n var range_idx;\n var insert_code;\n var copy_code;\n var insert_length;\n var copy_length;\n var distance_code;\n var distance;\n var context;\n var j;\n var copy_dst;\n\n br.readMoreInput();\n \n if (block_length[1] === 0) {\n DecodeBlockType(num_block_types[1],\n block_type_trees, 1, block_type, block_type_rb,\n block_type_rb_index, br);\n block_length[1] = ReadBlockLength(block_len_trees, HUFFMAN_MAX_TABLE_SIZE, br);\n htree_command = hgroup[1].htrees[block_type[1]];\n }\n --block_length[1];\n cmd_code = ReadSymbol(hgroup[1].codes, htree_command, br);\n range_idx = cmd_code >> 6;\n if (range_idx >= 2) {\n range_idx -= 2;\n distance_code = -1;\n } else {\n distance_code = 0;\n }\n insert_code = Prefix.kInsertRangeLut[range_idx] + ((cmd_code >> 3) & 7);\n copy_code = Prefix.kCopyRangeLut[range_idx] + (cmd_code & 7);\n insert_length = Prefix.kInsertLengthPrefixCode[insert_code].offset +\n br.readBits(Prefix.kInsertLengthPrefixCode[insert_code].nbits);\n copy_length = Prefix.kCopyLengthPrefixCode[copy_code].offset +\n br.readBits(Prefix.kCopyLengthPrefixCode[copy_code].nbits);\n prev_byte1 = ringbuffer[pos-1 & ringbuffer_mask];\n prev_byte2 = ringbuffer[pos-2 & ringbuffer_mask];\n for (j = 0; j < insert_length; ++j) {\n br.readMoreInput();\n\n if (block_length[0] === 0) {\n DecodeBlockType(num_block_types[0],\n block_type_trees, 0, block_type, block_type_rb,\n block_type_rb_index, br);\n block_length[0] = ReadBlockLength(block_len_trees, 0, br);\n context_offset = block_type[0] << kLiteralContextBits;\n context_map_slice = context_offset;\n context_mode = context_modes[block_type[0]];\n context_lookup_offset1 = Context.lookupOffsets[context_mode];\n context_lookup_offset2 = Context.lookupOffsets[context_mode + 1];\n }\n context = (Context.lookup[context_lookup_offset1 + prev_byte1] |\n Context.lookup[context_lookup_offset2 + prev_byte2]);\n literal_htree_index = context_map[context_map_slice + context];\n --block_length[0];\n prev_byte2 = prev_byte1;\n prev_byte1 = ReadSymbol(hgroup[0].codes, hgroup[0].htrees[literal_htree_index], br);\n ringbuffer[pos & ringbuffer_mask] = prev_byte1;\n if ((pos & ringbuffer_mask) === ringbuffer_mask) {\n output.write(ringbuffer, ringbuffer_size);\n }\n ++pos;\n }\n meta_block_remaining_len -= insert_length;\n if (meta_block_remaining_len <= 0) break;\n\n if (distance_code < 0) {\n var context;\n \n br.readMoreInput();\n if (block_length[2] === 0) {\n DecodeBlockType(num_block_types[2],\n block_type_trees, 2, block_type, block_type_rb,\n block_type_rb_index, br);\n block_length[2] = ReadBlockLength(block_len_trees, 2 * HUFFMAN_MAX_TABLE_SIZE, br);\n dist_context_offset = block_type[2] << kDistanceContextBits;\n dist_context_map_slice = dist_context_offset;\n }\n --block_length[2];\n context = (copy_length > 4 ? 3 : copy_length - 2) & 0xff;\n dist_htree_index = dist_context_map[dist_context_map_slice + context];\n distance_code = ReadSymbol(hgroup[2].codes, hgroup[2].htrees[dist_htree_index], br);\n if (distance_code >= num_direct_distance_codes) {\n var nbits;\n var postfix;\n var offset;\n distance_code -= num_direct_distance_codes;\n postfix = distance_code & distance_postfix_mask;\n distance_code >>= distance_postfix_bits;\n nbits = (distance_code >> 1) + 1;\n offset = ((2 + (distance_code & 1)) << nbits) - 4;\n distance_code = num_direct_distance_codes +\n ((offset + br.readBits(nbits)) <<\n distance_postfix_bits) + postfix;\n }\n }\n\n /* Convert the distance code to the actual distance by possibly looking */\n /* up past distnaces from the ringbuffer. */\n distance = TranslateShortCodes(distance_code, dist_rb, dist_rb_idx);\n if (distance < 0) {\n throw new Error('[BrotliDecompress] invalid distance');\n }\n\n if (pos < max_backward_distance &&\n max_distance !== max_backward_distance) {\n max_distance = pos;\n } else {\n max_distance = max_backward_distance;\n }\n\n copy_dst = pos & ringbuffer_mask;\n\n if (distance > max_distance) {\n if (copy_length >= BrotliDictionary.minDictionaryWordLength &&\n copy_length <= BrotliDictionary.maxDictionaryWordLength) {\n var offset = BrotliDictionary.offsetsByLength[copy_length];\n var word_id = distance - max_distance - 1;\n var shift = BrotliDictionary.sizeBitsByLength[copy_length];\n var mask = (1 << shift) - 1;\n var word_idx = word_id & mask;\n var transform_idx = word_id >> shift;\n offset += word_idx * copy_length;\n if (transform_idx < Transform.kNumTransforms) {\n var len = Transform.transformDictionaryWord(ringbuffer, copy_dst, offset, copy_length, transform_idx);\n copy_dst += len;\n pos += len;\n meta_block_remaining_len -= len;\n if (copy_dst >= ringbuffer_end) {\n output.write(ringbuffer, ringbuffer_size);\n \n for (var _x = 0; _x < (copy_dst - ringbuffer_end); _x++)\n ringbuffer[_x] = ringbuffer[ringbuffer_end + _x];\n }\n } else {\n throw new Error(\"Invalid backward reference. pos: \" + pos + \" distance: \" + distance +\n \" len: \" + copy_length + \" bytes left: \" + meta_block_remaining_len);\n }\n } else {\n throw new Error(\"Invalid backward reference. pos: \" + pos + \" distance: \" + distance +\n \" len: \" + copy_length + \" bytes left: \" + meta_block_remaining_len);\n }\n } else {\n if (distance_code > 0) {\n dist_rb[dist_rb_idx & 3] = distance;\n ++dist_rb_idx;\n }\n\n if (copy_length > meta_block_remaining_len) {\n throw new Error(\"Invalid backward reference. pos: \" + pos + \" distance: \" + distance +\n \" len: \" + copy_length + \" bytes left: \" + meta_block_remaining_len);\n }\n\n for (j = 0; j < copy_length; ++j) {\n ringbuffer[pos & ringbuffer_mask] = ringbuffer[(pos - distance) & ringbuffer_mask];\n if ((pos & ringbuffer_mask) === ringbuffer_mask) {\n output.write(ringbuffer, ringbuffer_size);\n }\n ++pos;\n --meta_block_remaining_len;\n }\n }\n\n /* When we get here, we must have inserted at least one literal and */\n /* made a copy of at least length two, therefore accessing the last 2 */\n /* bytes is valid. */\n prev_byte1 = ringbuffer[(pos - 1) & ringbuffer_mask];\n prev_byte2 = ringbuffer[(pos - 2) & ringbuffer_mask];\n }\n\n /* Protect pos from overflow, wrap it around at every GB of input data */\n pos &= 0x3fffffff;\n }\n\n output.write(ringbuffer, pos & ringbuffer_mask);\n}\n\nexports.BrotliDecompress = BrotliDecompress;\n\nBrotliDictionary.init();\n", "module.exports = require('./dec/decode').BrotliDecompressBuffer;\n", "import { registerFormat } from './base';\nimport TTFFont from './TTFFont';\nimport WOFFFont from './WOFFFont';\nimport WOFF2Font from './WOFF2Font';\nimport TrueTypeCollection from './TrueTypeCollection';\nimport DFont from './DFont';\n\n// Register font formats\nregisterFormat(TTFFont);\nregisterFormat(WOFFFont);\nregisterFormat(WOFF2Font);\nregisterFormat(TrueTypeCollection);\nregisterFormat(DFont);\n\nexport * from './base';\n", "// Node back-compat.\nconst ENCODING_MAPPING = {\n utf16le: 'utf-16le',\n ucs2: 'utf-16le',\n utf16be: 'utf-16be'\n}\n\nexport class DecodeStream {\n constructor(buffer) {\n this.buffer = buffer;\n this.view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n this.pos = 0;\n this.length = this.buffer.length;\n }\n\n readString(length, encoding = 'ascii') {\n encoding = ENCODING_MAPPING[encoding] || encoding;\n\n let buf = this.readBuffer(length);\n try {\n let decoder = new TextDecoder(encoding);\n return decoder.decode(buf);\n } catch (err) {\n return buf;\n }\n }\n\n readBuffer(length) {\n return this.buffer.slice(this.pos, (this.pos += length));\n }\n\n readUInt24BE() {\n return (this.readUInt16BE() << 8) + this.readUInt8();\n }\n\n readUInt24LE() {\n return this.readUInt16LE() + (this.readUInt8() << 16);\n }\n\n readInt24BE() {\n return (this.readInt16BE() << 8) + this.readUInt8();\n }\n\n readInt24LE() {\n return this.readUInt16LE() + (this.readInt8() << 16);\n }\n}\n\nDecodeStream.TYPES = {\n UInt8: 1,\n UInt16: 2,\n UInt24: 3,\n UInt32: 4,\n Int8: 1,\n Int16: 2,\n Int24: 3,\n Int32: 4,\n Float: 4,\n Double: 8\n};\n\nfor (let key of Object.getOwnPropertyNames(DataView.prototype)) {\n if (key.slice(0, 3) === 'get') {\n let type = key.slice(3).replace('Ui', 'UI');\n if (type === 'Float32') {\n type = 'Float';\n } else if (type === 'Float64') {\n type = 'Double';\n }\n let bytes = DecodeStream.TYPES[type];\n DecodeStream.prototype['read' + type + (bytes === 1 ? '' : 'BE')] = function () {\n const ret = this.view[key](this.pos, false);\n this.pos += bytes;\n return ret;\n };\n\n if (bytes !== 1) {\n DecodeStream.prototype['read' + type + 'LE'] = function () {\n const ret = this.view[key](this.pos, true);\n this.pos += bytes;\n return ret;\n };\n }\n }\n}\n", "import {DecodeStream} from './DecodeStream.js';\n\nconst textEncoder = new TextEncoder();\nconst isBigEndian = new Uint8Array(new Uint16Array([0x1234]).buffer)[0] == 0x12;\n\nexport class EncodeStream {\n constructor(buffer) {\n this.buffer = buffer;\n this.view = new DataView(this.buffer.buffer, this.buffer.byteOffset, this.buffer.byteLength);\n this.pos = 0;\n }\n\n writeBuffer(buffer) {\n this.buffer.set(buffer, this.pos);\n this.pos += buffer.length;\n }\n\n writeString(string, encoding = 'ascii') {\n let buf;\n switch (encoding) {\n case 'utf16le':\n case 'utf16-le':\n case 'ucs2': // node treats this the same as utf16.\n buf = stringToUtf16(string, isBigEndian);\n break;\n\n case 'utf16be':\n case 'utf16-be':\n buf = stringToUtf16(string, !isBigEndian);\n break;\n\n case 'utf8':\n buf = textEncoder.encode(string);\n break;\n\n case 'ascii':\n buf = stringToAscii(string);\n break;\n\n default:\n throw new Error(`Unsupported encoding: ${encoding}`);\n }\n\n this.writeBuffer(buf);\n }\n\n writeUInt24BE(val) {\n this.buffer[this.pos++] = (val >>> 16) & 0xff;\n this.buffer[this.pos++] = (val >>> 8) & 0xff;\n this.buffer[this.pos++] = val & 0xff;\n }\n\n writeUInt24LE(val) {\n this.buffer[this.pos++] = val & 0xff;\n this.buffer[this.pos++] = (val >>> 8) & 0xff;\n this.buffer[this.pos++] = (val >>> 16) & 0xff;\n }\n\n writeInt24BE(val) {\n if (val >= 0) {\n this.writeUInt24BE(val);\n } else {\n this.writeUInt24BE(val + 0xffffff + 1);\n }\n }\n\n writeInt24LE(val) {\n if (val >= 0) {\n this.writeUInt24LE(val);\n } else {\n this.writeUInt24LE(val + 0xffffff + 1);\n }\n }\n\n fill(val, length) {\n if (length < this.buffer.length) {\n this.buffer.fill(val, this.pos, this.pos + length);\n this.pos += length;\n } else {\n const buf = new Uint8Array(length);\n buf.fill(val);\n this.writeBuffer(buf);\n }\n }\n}\n\nfunction stringToUtf16(string, swap) {\n let buf = new Uint16Array(string.length);\n for (let i = 0; i < string.length; i++) {\n let code = string.charCodeAt(i);\n if (swap) {\n code = (code >> 8) | ((code & 0xff) << 8);\n }\n buf[i] = code;\n }\n return new Uint8Array(buf.buffer);\n}\n\nfunction stringToAscii(string) {\n let buf = new Uint8Array(string.length);\n for (let i = 0; i < string.length; i++) {\n // Match node.js behavior - encoding allows 8-bit rather than 7-bit.\n buf[i] = string.charCodeAt(i);\n }\n return buf;\n}\n\nfor (let key of Object.getOwnPropertyNames(DataView.prototype)) {\n if (key.slice(0, 3) === 'set') {\n let type = key.slice(3).replace('Ui', 'UI');\n if (type === 'Float32') {\n type = 'Float';\n } else if (type === 'Float64') {\n type = 'Double';\n }\n let bytes = DecodeStream.TYPES[type];\n EncodeStream.prototype['write' + type + (bytes === 1 ? '' : 'BE')] = function (value) {\n this.view[key](this.pos, value, false);\n this.pos += bytes;\n };\n\n if (bytes !== 1) {\n EncodeStream.prototype['write' + type + 'LE'] = function (value) {\n this.view[key](this.pos, value, true);\n this.pos += bytes;\n };\n }\n }\n}\n", "import {DecodeStream} from './DecodeStream.js';\nimport {EncodeStream} from './EncodeStream.js';\n\nexport class Base {\n fromBuffer(buffer) {\n let stream = new DecodeStream(buffer);\n return this.decode(stream);\n }\n\n toBuffer(value) {\n let size = this.size(value);\n let buffer = new Uint8Array(size);\n let stream = new EncodeStream(buffer);\n this.encode(stream, value);\n return buffer;\n }\n}\n", "import {DecodeStream} from './DecodeStream.js';\nimport {Base} from './Base.js';\n\nclass NumberT extends Base {\n constructor(type, endian = 'BE') {\n super();\n this.type = type;\n this.endian = endian;\n this.fn = this.type;\n if (this.type[this.type.length - 1] !== '8') {\n this.fn += this.endian;\n }\n }\n\n size() {\n return DecodeStream.TYPES[this.type];\n }\n\n decode(stream) {\n return stream[`read${this.fn}`]();\n }\n\n encode(stream, val) {\n return stream[`write${this.fn}`](val);\n }\n}\n\nexport {NumberT as Number};\n\nexport const uint8 = new NumberT('UInt8');\nexport const uint16be = new NumberT('UInt16', 'BE');\nexport const uint16 = uint16be;\nexport const uint16le = new NumberT('UInt16', 'LE');\nexport const uint24be = new NumberT('UInt24', 'BE');\nexport const uint24 = uint24be;\nexport const uint24le = new NumberT('UInt24', 'LE');\nexport const uint32be = new NumberT('UInt32', 'BE');\nexport const uint32 = uint32be;\nexport const uint32le = new NumberT('UInt32', 'LE');\nexport const int8 = new NumberT('Int8');\nexport const int16be = new NumberT('Int16', 'BE');\nexport const int16 = int16be;\nexport const int16le = new NumberT('Int16', 'LE');\nexport const int24be = new NumberT('Int24', 'BE');\nexport const int24 = int24be;\nexport const int24le = new NumberT('Int24', 'LE');\nexport const int32be = new NumberT('Int32', 'BE');\nexport const int32 = int32be;\nexport const int32le = new NumberT('Int32', 'LE');\nexport const floatbe = new NumberT('Float', 'BE');\nexport const float = floatbe;\nexport const floatle = new NumberT('Float', 'LE');\nexport const doublebe = new NumberT('Double', 'BE');\nexport const double = doublebe;\nexport const doublele = new NumberT('Double', 'LE');\n\nexport class Fixed extends NumberT {\n constructor(size, endian, fracBits = size >> 1) {\n super(`Int${size}`, endian);\n this._point = 1 << fracBits;\n }\n\n decode(stream) {\n return super.decode(stream) / this._point;\n }\n\n encode(stream, val) {\n return super.encode(stream, (val * this._point) | 0);\n }\n}\n\nexport const fixed16be = new Fixed(16, 'BE');\nexport const fixed16 = fixed16be;\nexport const fixed16le = new Fixed(16, 'LE');\nexport const fixed32be = new Fixed(32, 'BE');\nexport const fixed32 = fixed32be;\nexport const fixed32le = new Fixed(32, 'LE');\n", "import {Number as NumberT} from './Number.js';\n\nexport function resolveLength(length, stream, parent) {\n let res;\n if (typeof length === 'number') {\n res = length;\n\n } else if (typeof length === 'function') {\n res = length.call(parent, parent);\n\n } else if (parent && (typeof length === 'string')) {\n res = parent[length];\n\n } else if (stream && length instanceof NumberT) {\n res = length.decode(stream);\n }\n\n if (isNaN(res)) {\n throw new Error('Not a fixed size');\n }\n\n return res;\n};\n\nexport class PropertyDescriptor {\n constructor(opts = {}) {\n this.enumerable = true;\n this.configurable = true;\n\n for (let key in opts) {\n const val = opts[key];\n this[key] = val;\n }\n }\n}\n", "import {Base} from './Base.js';\nimport {Number as NumberT} from './Number.js';\nimport * as utils from './utils.js';\n\nclass ArrayT extends Base {\n constructor(type, length, lengthType = 'count') {\n super();\n this.type = type;\n this.length = length;\n this.lengthType = lengthType;\n }\n\n decode(stream, parent) {\n let length;\n const { pos } = stream;\n\n const res = [];\n let ctx = parent;\n\n if (this.length != null) {\n length = utils.resolveLength(this.length, stream, parent);\n }\n\n if (this.length instanceof NumberT) {\n // define hidden properties\n Object.defineProperties(res, {\n parent: { value: parent },\n _startOffset: { value: pos },\n _currentOffset: { value: 0, writable: true },\n _length: { value: length }\n });\n\n ctx = res;\n }\n\n if ((length == null) || (this.lengthType === 'bytes')) {\n const target = (length != null) ?\n stream.pos + length\n : (parent != null ? parent._length : undefined) ?\n parent._startOffset + parent._length\n :\n stream.length;\n\n while (stream.pos < target) {\n res.push(this.type.decode(stream, ctx));\n }\n\n } else {\n for (let i = 0, end = length; i < end; i++) {\n res.push(this.type.decode(stream, ctx));\n }\n }\n\n return res;\n }\n\n size(array, ctx, includePointers = true) {\n if (!array) {\n return this.type.size(null, ctx) * utils.resolveLength(this.length, null, ctx);\n }\n\n let size = 0;\n if (this.length instanceof NumberT) {\n size += this.length.size();\n ctx = {parent: ctx, pointerSize: 0};\n }\n\n for (let item of array) {\n size += this.type.size(item, ctx);\n }\n\n if (ctx && includePointers && this.length instanceof NumberT) {\n size += ctx.pointerSize;\n }\n \n return size;\n }\n\n encode(stream, array, parent) {\n let ctx = parent;\n if (this.length instanceof NumberT) {\n ctx = {\n pointers: [],\n startOffset: stream.pos,\n parent\n };\n\n ctx.pointerOffset = stream.pos + this.size(array, ctx, false);\n this.length.encode(stream, array.length);\n }\n\n for (let item of array) {\n this.type.encode(stream, item, ctx);\n }\n\n if (this.length instanceof NumberT) {\n let i = 0;\n while (i < ctx.pointers.length) {\n const ptr = ctx.pointers[i++];\n ptr.type.encode(stream, ptr.val, ptr.parent);\n }\n }\n }\n}\n\nexport {ArrayT as Array};\n", "import {Array as ArrayT} from './Array.js';\nimport {Number as NumberT} from './Number.js';\nimport * as utils from './utils.js';\n\nexport class LazyArray extends ArrayT {\n decode(stream, parent) {\n const { pos } = stream;\n const length = utils.resolveLength(this.length, stream, parent);\n\n if (this.length instanceof NumberT) {\n parent = {\n parent,\n _startOffset: pos,\n _currentOffset: 0,\n _length: length\n };\n }\n\n const res = new LazyArrayValue(this.type, length, stream, parent);\n\n stream.pos += length * this.type.size(null, parent);\n return res;\n }\n\n size(val, ctx) {\n if (val instanceof LazyArrayValue) {\n val = val.toArray();\n }\n\n return super.size(val, ctx);\n }\n\n encode(stream, val, ctx) {\n if (val instanceof LazyArrayValue) {\n val = val.toArray();\n }\n\n return super.encode(stream, val, ctx);\n }\n}\n\nclass LazyArrayValue {\n constructor(type, length, stream, ctx) {\n this.type = type;\n this.length = length;\n this.stream = stream;\n this.ctx = ctx;\n this.base = this.stream.pos;\n this.items = [];\n }\n\n get(index) {\n if ((index < 0) || (index >= this.length)) {\n return undefined;\n }\n\n if (this.items[index] == null) {\n const { pos } = this.stream;\n this.stream.pos = this.base + (this.type.size(null, this.ctx) * index);\n this.items[index] = this.type.decode(this.stream, this.ctx);\n this.stream.pos = pos;\n }\n\n return this.items[index];\n }\n\n toArray() {\n const result = [];\n for (let i = 0, end = this.length; i < end; i++) {\n result.push(this.get(i));\n }\n return result;\n }\n}\n", "import {Base} from './Base.js';\n\nexport class Bitfield extends Base {\n constructor(type, flags = []) {\n super();\n this.type = type;\n this.flags = flags;\n }\n\n decode(stream) {\n const val = this.type.decode(stream);\n\n const res = {};\n for (let i = 0; i < this.flags.length; i++) {\n const flag = this.flags[i];\n if (flag != null) {\n res[flag] = !!(val & (1 << i));\n }\n }\n\n return res;\n }\n\n size() {\n return this.type.size();\n }\n\n encode(stream, keys) {\n let val = 0;\n for (let i = 0; i < this.flags.length; i++) {\n const flag = this.flags[i];\n if (flag != null) {\n if (keys[flag]) { val |= (1 << i); }\n }\n }\n\n return this.type.encode(stream, val);\n }\n}\n", "import {Base} from './Base.js';\nimport {Number as NumberT} from './Number.js';\nimport * as utils from './utils.js';\n\nexport class BufferT extends Base {\n constructor(length) {\n super();\n this.length = length;\n }\n \n decode(stream, parent) {\n const length = utils.resolveLength(this.length, stream, parent);\n return stream.readBuffer(length);\n }\n\n size(val, parent) {\n if (!val) {\n return utils.resolveLength(this.length, null, parent);\n }\n\n let len = val.length;\n if (this.length instanceof NumberT) {\n len += this.length.size();\n }\n\n return len;\n }\n\n encode(stream, buf, parent) {\n if (this.length instanceof NumberT) {\n this.length.encode(stream, buf.length);\n }\n\n return stream.writeBuffer(buf);\n }\n}\n\nexport {BufferT as Buffer};\n", "import {Base} from './Base.js';\n\nexport class Optional extends Base {\n constructor(type, condition = true) {\n super();\n this.type = type;\n this.condition = condition;\n }\n\n decode(stream, parent) {\n let { condition } = this;\n if (typeof condition === 'function') {\n condition = condition.call(parent, parent);\n }\n\n if (condition) {\n return this.type.decode(stream, parent);\n }\n }\n\n size(val, parent) {\n let { condition } = this;\n if (typeof condition === 'function') {\n condition = condition.call(parent, parent);\n }\n\n if (condition) {\n return this.type.size(val, parent);\n } else {\n return 0;\n }\n }\n\n encode(stream, val, parent) {\n let { condition } = this;\n if (typeof condition === 'function') {\n condition = condition.call(parent, parent);\n }\n\n if (condition) {\n return this.type.encode(stream, val, parent);\n }\n }\n}\n", "import {Base} from './Base.js';\nimport * as utils from './utils.js';\n\nexport class Reserved extends Base {\n constructor(type, count = 1) {\n super();\n this.type = type;\n this.count = count;\n }\n decode(stream, parent) {\n stream.pos += this.size(null, parent);\n return undefined;\n }\n\n size(data, parent) {\n const count = utils.resolveLength(this.count, null, parent);\n return this.type.size() * count;\n }\n\n encode(stream, val, parent) {\n return stream.fill(0, this.size(val, parent));\n }\n}\n", "import {Base} from './Base.js';\nimport {Number as NumberT} from './Number.js';\nimport * as utils from './utils.js';\n\nclass StringT extends Base {\n constructor(length, encoding = 'ascii') {\n super();\n this.length = length;\n this.encoding = encoding;\n }\n\n decode(stream, parent) {\n let length, pos;\n\n let { encoding } = this;\n if (typeof encoding === 'function') {\n encoding = encoding.call(parent, parent) || 'ascii';\n }\n let width = encodingWidth(encoding);\n\n if (this.length != null) {\n length = utils.resolveLength(this.length, stream, parent);\n } else {\n let buffer;\n ({buffer, length, pos} = stream);\n\n while ((pos < length - width + 1) &&\n (buffer[pos] !== 0x00 ||\n (width === 2 && buffer[pos+1] !== 0x00)\n )) {\n pos += width;\n }\n\n length = pos - stream.pos;\n }\n\n\n const string = stream.readString(length, encoding);\n\n if ((this.length == null) && (stream.pos < stream.length)) {\n stream.pos+=width;\n }\n\n return string;\n }\n\n size(val, parent) {\n // Use the defined value if no value was given\n if (val === undefined || val === null) {\n return utils.resolveLength(this.length, null, parent);\n }\n\n let { encoding } = this;\n if (typeof encoding === 'function') {\n encoding = encoding.call(parent != null ? parent.val : undefined, parent != null ? parent.val : undefined) || 'ascii';\n }\n\n if (encoding === 'utf16be') {\n encoding = 'utf16le';\n }\n\n let size = byteLength(val, encoding);\n if (this.length instanceof NumberT) {\n size += this.length.size();\n }\n\n if ((this.length == null)) {\n size += encodingWidth(encoding);\n }\n\n return size;\n }\n\n encode(stream, val, parent) {\n let { encoding } = this;\n if (typeof encoding === 'function') {\n encoding = encoding.call(parent != null ? parent.val : undefined, parent != null ? parent.val : undefined) || 'ascii';\n }\n\n if (this.length instanceof NumberT) {\n this.length.encode(stream, byteLength(val, encoding));\n }\n\n stream.writeString(val, encoding);\n\n if ((this.length == null)) {\n return encodingWidth(encoding) == 2 ?\n stream.writeUInt16LE(0x0000) :\n stream.writeUInt8(0x00);\n }\n }\n}\n\nfunction encodingWidth(encoding) {\n switch(encoding) {\n case 'ascii':\n case 'utf8': // utf8 is a byte-based encoding for zero-term string\n return 1;\n case 'utf16le':\n case 'utf16-le':\n case 'utf-16be':\n case 'utf-16le':\n case 'utf16be':\n case 'utf16-be':\n case 'ucs2':\n return 2;\n default:\n //TODO: assume all other encodings are 1-byters\n //throw new Error('Unknown encoding ' + encoding);\n return 1;\n }\n}\n\nfunction byteLength(string, encoding) {\n switch (encoding) {\n case 'ascii':\n return string.length;\n case 'utf8':\n let len = 0;\n for (let i = 0; i < string.length; i++) {\n let c = string.charCodeAt(i);\n\n if (c >= 0xd800 && c <= 0xdbff && i < string.length - 1) {\n let c2 = string.charCodeAt(++i);\n if ((c2 & 0xfc00) === 0xdc00) {\n c = ((c & 0x3ff) << 10) + (c2 & 0x3ff) + 0x10000;\n } else {\n // unmatched surrogate.\n i--;\n }\n }\n\n if ((c & 0xffffff80) === 0) {\n len++;\n } else if ((c & 0xfffff800) === 0) {\n len += 2;\n } else if ((c & 0xffff0000) === 0) {\n len += 3;\n } else if ((c & 0xffe00000) === 0) {\n len += 4;\n }\n }\n return len;\n case 'utf16le':\n case 'utf16-le':\n case 'utf16be':\n case 'utf16-be':\n case 'ucs2':\n return string.length * 2;\n default:\n throw new Error('Unknown encoding ' + encoding);\n }\n}\n\nexport {StringT as String};\n", "import {Base} from './Base.js';\nimport * as utils from './utils.js';\n\nexport class Struct extends Base {\n constructor(fields = {}) {\n super();\n this.fields = fields;\n }\n\n decode(stream, parent, length = 0) {\n const res = this._setup(stream, parent, length);\n this._parseFields(stream, res, this.fields);\n\n if (this.process != null) {\n this.process.call(res, stream);\n }\n return res;\n }\n\n _setup(stream, parent, length) {\n const res = {};\n\n // define hidden properties\n Object.defineProperties(res, {\n parent: { value: parent },\n _startOffset: { value: stream.pos },\n _currentOffset: { value: 0, writable: true },\n _length: { value: length }\n });\n\n return res;\n }\n\n _parseFields(stream, res, fields) {\n for (let key in fields) {\n var val;\n const type = fields[key];\n if (typeof type === 'function') {\n val = type.call(res, res);\n } else {\n val = type.decode(stream, res);\n }\n\n if (val !== undefined) {\n if (val instanceof utils.PropertyDescriptor) {\n Object.defineProperty(res, key, val);\n } else {\n res[key] = val;\n }\n }\n\n res._currentOffset = stream.pos - res._startOffset;\n }\n\n }\n\n size(val, parent, includePointers = true) {\n if (val == null) { val = {}; }\n const ctx = {\n parent,\n val,\n pointerSize: 0\n };\n\n if (this.preEncode != null) {\n this.preEncode.call(val);\n }\n\n let size = 0;\n for (let key in this.fields) {\n const type = this.fields[key];\n if (type.size != null) {\n size += type.size(val[key], ctx);\n }\n }\n\n if (includePointers) {\n size += ctx.pointerSize;\n }\n\n return size;\n }\n\n encode(stream, val, parent) {\n let type;\n if (this.preEncode != null) {\n this.preEncode.call(val, stream);\n }\n\n const ctx = {\n pointers: [],\n startOffset: stream.pos,\n parent,\n val,\n pointerSize: 0\n };\n\n ctx.pointerOffset = stream.pos + this.size(val, ctx, false);\n\n for (let key in this.fields) {\n type = this.fields[key];\n if (type.encode != null) {\n type.encode(stream, val[key], ctx);\n }\n }\n\n let i = 0;\n while (i < ctx.pointers.length) {\n const ptr = ctx.pointers[i++];\n ptr.type.encode(stream, ptr.val, ptr.parent);\n }\n }\n}\n", "import {Struct} from './Struct.js';\n\nconst getPath = (object, pathArray) => {\n return pathArray.reduce((prevObj, key) => prevObj && prevObj[key], object);\n};\n\nexport class VersionedStruct extends Struct {\n constructor(type, versions = {}) {\n super();\n this.type = type;\n this.versions = versions;\n if (typeof type === 'string') {\n this.versionPath = type.split('.');\n }\n }\n\n decode(stream, parent, length = 0) {\n const res = this._setup(stream, parent, length);\n\n if (typeof this.type === 'string') {\n res.version = getPath(parent, this.versionPath);\n } else {\n res.version = this.type.decode(stream);\n }\n\n if (this.versions.header) {\n this._parseFields(stream, res, this.versions.header);\n }\n\n const fields = this.versions[res.version];\n if ((fields == null)) {\n throw new Error(`Unknown version ${res.version}`);\n }\n\n if (fields instanceof VersionedStruct) {\n return fields.decode(stream, parent);\n }\n\n this._parseFields(stream, res, fields);\n\n if (this.process != null) {\n this.process.call(res, stream);\n }\n return res;\n }\n\n size(val, parent, includePointers = true) {\n let key, type;\n if (!val) {\n throw new Error('Not a fixed size');\n }\n\n if (this.preEncode != null) {\n this.preEncode.call(val);\n }\n\n const ctx = {\n parent,\n val,\n pointerSize: 0\n };\n\n let size = 0;\n if (typeof this.type !== 'string') {\n size += this.type.size(val.version, ctx);\n }\n\n if (this.versions.header) {\n for (key in this.versions.header) {\n type = this.versions.header[key];\n if (type.size != null) {\n size += type.size(val[key], ctx);\n }\n }\n }\n\n const fields = this.versions[val.version];\n if ((fields == null)) {\n throw new Error(`Unknown version ${val.version}`);\n }\n\n for (key in fields) {\n type = fields[key];\n if (type.size != null) {\n size += type.size(val[key], ctx);\n }\n }\n\n if (includePointers) {\n size += ctx.pointerSize;\n }\n\n return size;\n }\n\n encode(stream, val, parent) {\n let key, type;\n if (this.preEncode != null) {\n this.preEncode.call(val, stream);\n }\n\n const ctx = {\n pointers: [],\n startOffset: stream.pos,\n parent,\n val,\n pointerSize: 0\n };\n\n ctx.pointerOffset = stream.pos + this.size(val, ctx, false);\n\n if (typeof this.type !== 'string') {\n this.type.encode(stream, val.version);\n }\n\n if (this.versions.header) {\n for (key in this.versions.header) {\n type = this.versions.header[key];\n if (type.encode != null) {\n type.encode(stream, val[key], ctx);\n }\n }\n }\n\n const fields = this.versions[val.version];\n for (key in fields) {\n type = fields[key];\n if (type.encode != null) {\n type.encode(stream, val[key], ctx);\n }\n }\n\n let i = 0;\n while (i < ctx.pointers.length) {\n const ptr = ctx.pointers[i++];\n ptr.type.encode(stream, ptr.val, ptr.parent);\n }\n }\n}\n", "import * as utils from './utils.js';\nimport {Base} from './Base.js';\n\nexport class Pointer extends Base {\n constructor(offsetType, type, options = {}) {\n super();\n this.offsetType = offsetType;\n this.type = type;\n this.options = options;\n if (this.type === 'void') { this.type = null; }\n if (this.options.type == null) { this.options.type = 'local'; }\n if (this.options.allowNull == null) { this.options.allowNull = true; }\n if (this.options.nullValue == null) { this.options.nullValue = 0; }\n if (this.options.lazy == null) { this.options.lazy = false; }\n if (this.options.relativeTo) {\n if (typeof this.options.relativeTo !== 'function') {\n throw new Error('relativeTo option must be a function');\n }\n this.relativeToGetter = options.relativeTo;\n }\n }\n\n decode(stream, ctx) {\n const offset = this.offsetType.decode(stream, ctx);\n\n // handle NULL pointers\n if ((offset === this.options.nullValue) && this.options.allowNull) {\n return null;\n }\n\n let relative;\n switch (this.options.type) {\n case 'local': relative = ctx._startOffset; break;\n case 'immediate': relative = stream.pos - this.offsetType.size(); break;\n case 'parent': relative = ctx.parent._startOffset; break;\n default:\n var c = ctx;\n while (c.parent) {\n c = c.parent;\n }\n\n relative = c._startOffset || 0;\n }\n\n if (this.options.relativeTo) {\n relative += this.relativeToGetter(ctx);\n }\n\n const ptr = offset + relative;\n\n if (this.type != null) {\n let val = null;\n const decodeValue = () => {\n if (val != null) { return val; }\n\n const { pos } = stream;\n stream.pos = ptr;\n val = this.type.decode(stream, ctx);\n stream.pos = pos;\n return val;\n };\n\n // If this is a lazy pointer, define a getter to decode only when needed.\n // This obviously only works when the pointer is contained by a Struct.\n if (this.options.lazy) {\n return new utils.PropertyDescriptor({\n get: decodeValue});\n }\n\n return decodeValue();\n } else {\n return ptr;\n }\n }\n\n size(val, ctx) {\n const parent = ctx;\n switch (this.options.type) {\n case 'local': case 'immediate':\n break;\n case 'parent':\n ctx = ctx.parent;\n break;\n default: // global\n while (ctx.parent) {\n ctx = ctx.parent;\n }\n }\n\n let { type } = this;\n if (type == null) {\n if (!(val instanceof VoidPointer)) {\n throw new Error(\"Must be a VoidPointer\");\n }\n\n ({ type } = val);\n val = val.value;\n }\n\n if (val && ctx) {\n // Must be written as two separate lines rather than += in case `type.size` mutates ctx.pointerSize.\n let size = type.size(val, parent);\n ctx.pointerSize += size;\n }\n\n return this.offsetType.size();\n }\n\n encode(stream, val, ctx) {\n let relative;\n const parent = ctx;\n if ((val == null)) {\n this.offsetType.encode(stream, this.options.nullValue);\n return;\n }\n\n switch (this.options.type) {\n case 'local':\n relative = ctx.startOffset;\n break;\n case 'immediate':\n relative = stream.pos + this.offsetType.size(val, parent);\n break;\n case 'parent':\n ctx = ctx.parent;\n relative = ctx.startOffset;\n break;\n default: // global\n relative = 0;\n while (ctx.parent) {\n ctx = ctx.parent;\n }\n }\n\n if (this.options.relativeTo) {\n relative += this.relativeToGetter(parent.val);\n }\n\n this.offsetType.encode(stream, ctx.pointerOffset - relative);\n\n let { type } = this;\n if (type == null) {\n if (!(val instanceof VoidPointer)) {\n throw new Error(\"Must be a VoidPointer\");\n }\n\n ({ type } = val);\n val = val.value;\n }\n\n ctx.pointers.push({\n type,\n val,\n parent\n });\n\n return ctx.pointerOffset += type.size(val, parent);\n }\n}\n\n// A pointer whose type is determined at decode time\nexport class VoidPointer {\n constructor(type, value) {\n this.type = type;\n this.value = value;\n }\n}\n", "import { DecodeStream } from 'restructure';\n\n/** @typedef {import('../types/fontkit').FontFormat} FontFormat */\n/** @typedef {import('../types/fontkit').OpenedFont} OpenedFont */\n\nexport let logErrors = false;\n\n/** @type {FontFormat[]} */\nlet formats = [];\n\n/**\n * @param {FontFormat} format\n * @returns {void}\n */\nexport function registerFormat(format) {\n formats.push(format);\n};\n\n/**\n * @param {ArrayBufferView} buffer\n * @param {string | Uint8Array} [postscriptName]\n * @returns {OpenedFont | null | undefined}\n */\nexport function create(buffer, postscriptName) {\n for (let i = 0; i < formats.length; i++) {\n let format = formats[i];\n if (format.probe(buffer)) {\n let font = new format(new DecodeStream(buffer));\n if (postscriptName) {\n return font.getFont(postscriptName);\n }\n\n return font;\n }\n }\n\n throw new Error('Unknown font format');\n};\n\nexport let defaultLanguage = 'en';\n\n/**\n * @param {string} [lang]\n * @returns {void}\n */\nexport function setDefaultLanguage(lang = 'en') {\n defaultLanguage = lang;\n};\n", "/**\n * Cache decorator for getters/methods.\n * Results are lazily computed once, then cached on the instance.\n *\n * @template T\n * @param {object} target\n * @param {string} key\n * @param {TypedPropertyDescriptor<T>} descriptor\n * @returns {TypedPropertyDescriptor<T> | void}\n */\nexport function cache(target, key, descriptor) {\n if (descriptor.get) {\n let get = descriptor.get;\n descriptor.get = function () {\n let value = get.call(this);\n Object.defineProperty(this, key, { value });\n return value;\n };\n return;\n }\n\n if (typeof descriptor.value === 'function') {\n let fn = /** @type {(...args: unknown[]) => T} */ (descriptor.value);\n\n /** @type {TypedPropertyDescriptor<T>} */\n let replacement = {\n configurable: true,\n enumerable: false,\n get() {\n /** @type {Map<unknown, T>} */\n let cacheMap = new Map();\n\n /**\n * @param {...unknown} args\n * @returns {T}\n */\n let memoized = (...args) => {\n let cacheKey = args.length > 0 ? args[0] : 'value';\n if (cacheMap.has(cacheKey)) {\n return /** @type {T} */ (cacheMap.get(cacheKey));\n }\n\n let result = fn.apply(this, args);\n cacheMap.set(cacheKey, result);\n return result;\n };\n\n Object.defineProperty(this, key, { value: memoized });\n return /** @type {T} */ (/** @type {unknown} */ (memoized));\n }\n };\n\n return replacement;\n }\n}\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\nlet SubHeader = new r.Struct({\n firstCode: r.uint16,\n entryCount: r.uint16,\n idDelta: r.int16,\n idRangeOffset: r.uint16\n});\n\nlet CmapGroup = new r.Struct({\n startCharCode: r.uint32,\n endCharCode: r.uint32,\n glyphID: r.uint32\n});\n\nlet UnicodeValueRange = new r.Struct({\n startUnicodeValue: r.uint24,\n additionalCount: r.uint8\n});\n\nlet UVSMapping = new r.Struct({\n unicodeValue: r.uint24,\n glyphID: r.uint16\n});\n\nlet DefaultUVS = new r.Array(UnicodeValueRange, r.uint32);\nlet NonDefaultUVS = new r.Array(UVSMapping, r.uint32);\n\nlet VarSelectorRecord = new r.Struct({\n varSelector: r.uint24,\n defaultUVS: new r.Pointer(r.uint32, DefaultUVS, { type: 'parent' }),\n nonDefaultUVS: new r.Pointer(r.uint32, NonDefaultUVS, { type: 'parent' })\n});\n\nlet CmapSubtable = new r.VersionedStruct(r.uint16, {\n 0: { // Byte encoding\n length: r.uint16, // Total table length in bytes (set to 262 for format 0)\n language: r.uint16, // Language code for this encoding subtable, or zero if language-independent\n codeMap: new r.LazyArray(r.uint8, 256)\n },\n\n 2: { // High-byte mapping (CJK)\n length: r.uint16,\n language: r.uint16,\n subHeaderKeys: new r.Array(r.uint16, 256),\n /**\n * Keys store subHeaderIndex * 8; count is max index + 1.\n * @param {StructValue} t\n * @returns {number}\n */\n subHeaderCount: t => (Math.max.apply(Math, /** @type {number[]} */ (t.subHeaderKeys)) / 8) + 1,\n subHeaders: new r.LazyArray(SubHeader, 'subHeaderCount'),\n glyphIndexArray: new r.LazyArray(\n r.uint16,\n /** @param {StructValue} t @returns {number} */\n t => (/** @type {number} */ (t.length) - /** @type {number} */ (t._currentOffset)) / 2\n )\n },\n\n 4: { // Segment mapping to delta values\n length: r.uint16, // Total table length in bytes\n language: r.uint16, // Language code\n segCountX2: r.uint16,\n /**\n * @param {StructValue} t\n * @returns {number}\n */\n segCount: t => /** @type {number} */ (t.segCountX2) >> 1,\n searchRange: r.uint16,\n entrySelector: r.uint16,\n rangeShift: r.uint16,\n endCode: new r.LazyArray(r.uint16, 'segCount'),\n reservedPad: new r.Reserved(r.uint16), // This value should be zero\n startCode: new r.LazyArray(r.uint16, 'segCount'),\n idDelta: new r.LazyArray(r.int16, 'segCount'),\n idRangeOffset: new r.LazyArray(r.uint16, 'segCount'),\n glyphIndexArray: new r.LazyArray(\n r.uint16,\n /** @param {StructValue} t @returns {number} */\n t => (/** @type {number} */ (t.length) - /** @type {number} */ (t._currentOffset)) / 2\n )\n },\n\n 6: { // Trimmed table\n length: r.uint16,\n language: r.uint16,\n firstCode: r.uint16,\n entryCount: r.uint16,\n glyphIndices: new r.LazyArray(r.uint16, 'entryCount')\n },\n\n 8: { // mixed 16-bit and 32-bit coverage\n reserved: new r.Reserved(r.uint16),\n length: r.uint32,\n language: r.uint16,\n is32: new r.LazyArray(r.uint8, 8192),\n nGroups: r.uint32,\n groups: new r.LazyArray(CmapGroup, 'nGroups')\n },\n\n 10: { // Trimmed Array\n reserved: new r.Reserved(r.uint16),\n length: r.uint32,\n language: r.uint32,\n firstCode: r.uint32,\n entryCount: r.uint32, // OpenType name: numChars\n glyphIndices: new r.LazyArray(r.uint16, 'entryCount')\n },\n\n 12: { // Segmented coverage\n reserved: new r.Reserved(r.uint16),\n length: r.uint32,\n language: r.uint32,\n nGroups: r.uint32,\n groups: new r.LazyArray(CmapGroup, 'nGroups')\n },\n\n 13: { // Many-to-one range mappings (same as 12 except for group.startGlyphID)\n reserved: new r.Reserved(r.uint16),\n length: r.uint32,\n language: r.uint32,\n nGroups: r.uint32,\n groups: new r.LazyArray(CmapGroup, 'nGroups')\n },\n\n 14: { // Unicode Variation Sequences\n length: r.uint32,\n numRecords: r.uint32,\n varSelectors: new r.LazyArray(VarSelectorRecord, 'numRecords')\n }\n});\n\nlet CmapEntry = new r.Struct({\n platformID: r.uint16, // Platform identifier\n encodingID: r.uint16, // Platform-specific encoding identifier\n table: new r.Pointer(r.uint32, CmapSubtable, { type: 'parent', lazy: true })\n});\n\n// character to glyph mapping\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.uint16,\n numSubtables: r.uint16,\n tables: new r.Array(CmapEntry, 'numSubtables')\n});\n", "import * as r from 'restructure';\n\n// font header\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.int32, // 0x00010000 (version 1.0)\n revision: r.int32, // set by font manufacturer\n checkSumAdjustment: r.uint32,\n magicNumber: r.uint32, // set to 0x5F0F3CF5\n flags: r.uint16,\n unitsPerEm: r.uint16, // range from 64 to 16384\n created: new r.Array(r.int32, 2),\n modified: new r.Array(r.int32, 2),\n xMin: r.int16, // for all glyph bounding boxes\n yMin: r.int16, // for all glyph bounding boxes\n xMax: r.int16, // for all glyph bounding boxes\n yMax: r.int16, // for all glyph bounding boxes\n macStyle: new r.Bitfield(r.uint16, [\n 'bold', 'italic', 'underline', 'outline',\n 'shadow', 'condensed', 'extended'\n ]),\n lowestRecPPEM: r.uint16, // smallest readable size in pixels\n fontDirectionHint: r.int16,\n indexToLocFormat: r.int16, // 0 for short offsets, 1 for long\n glyphDataFormat: r.int16 // 0 for current format\n});\n", "import * as r from 'restructure';\n\n// horizontal header\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.int32,\n ascent: r.int16, // Distance from baseline of highest ascender\n descent: r.int16, // Distance from baseline of lowest descender\n lineGap: r.int16, // Typographic line gap\n advanceWidthMax: r.uint16, // Maximum advance width value in 'hmtx' table\n minLeftSideBearing: r.int16, // Maximum advance width value in 'hmtx' table\n minRightSideBearing: r.int16, // Minimum right sidebearing value\n xMaxExtent: r.int16,\n caretSlopeRise: r.int16, // Used to calculate the slope of the cursor (rise/run); 1 for vertical\n caretSlopeRun: r.int16, // 0 for vertical\n caretOffset: r.int16, // Set to 0 for non-slanted fonts\n reserved: new r.Reserved(r.int16, 4),\n metricDataFormat: r.int16, // 0 for current format\n numberOfMetrics: r.uint16 // Number of advance widths in 'hmtx' table\n});\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\nlet HmtxEntry = new r.Struct({\n advance: r.uint16,\n bearing: r.int16\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n metrics: new r.LazyArray(\n HmtxEntry,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (/** @type {StructValue} */ (/** @type {StructValue} */ (t.parent).hhea).numberOfMetrics)\n ),\n bearings: new r.LazyArray(\n r.int16,\n /** @param {StructValue} t @returns {number} */\n (t) => {\n let parent = /** @type {StructValue} */ (t.parent);\n let maxp = /** @type {StructValue} */ (parent.maxp);\n let hhea = /** @type {StructValue} */ (parent.hhea);\n return /** @type {number} */ (maxp.numGlyphs) - /** @type {number} */ (hhea.numberOfMetrics);\n }\n )\n});\n", "import * as r from 'restructure';\n\n// maxiumum profile\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.int32,\n numGlyphs: r.uint16, // The number of glyphs in the font\n maxPoints: r.uint16, // Maximum points in a non-composite glyph\n maxContours: r.uint16, // Maximum contours in a non-composite glyph\n maxComponentPoints: r.uint16, // Maximum points in a composite glyph\n maxComponentContours: r.uint16, // Maximum contours in a composite glyph\n maxZones: r.uint16, // 1 if instructions do not use the twilight zone, 2 otherwise\n maxTwilightPoints: r.uint16, // Maximum points used in Z0\n maxStorage: r.uint16, // Number of Storage Area locations\n maxFunctionDefs: r.uint16, // Number of FDEFs\n maxInstructionDefs: r.uint16, // Number of IDEFs\n maxStackElements: r.uint16, // Maximum stack depth\n maxSizeOfInstructions: r.uint16, // Maximum byte count for glyph instructions\n maxComponentElements: r.uint16, // Maximum number of components referenced at \u201Ctop level\u201D for any composite glyph\n maxComponentDepth: r.uint16 // Maximum levels of recursion; 1 for simple components\n});\n", "/**\n * Gets an encoding name from platform, encoding, and language ids.\n * Returned encoding names can be used in iconv-lite to decode text.\n * @param {number} platformID\n * @param {number} encodingID\n * @param {number} [languageID]\n * @returns {string | null | undefined}\n */\nexport function getEncoding(platformID, encodingID, languageID = 0) {\n if (platformID === 1 && MAC_LANGUAGE_ENCODINGS[languageID]) {\n return MAC_LANGUAGE_ENCODINGS[languageID];\n }\n\n return ENCODINGS[platformID][encodingID];\n}\n\n/** @type {Set<string>} */\nconst SINGLE_BYTE_ENCODINGS = new Set(['x-mac-roman', 'x-mac-cyrillic', 'iso-8859-6', 'iso-8859-8']);\n\n/** @type {Record<string, string>} */\nconst MAC_ENCODINGS = {\n 'x-mac-croatian': '\u00C4\u00C5\u00C7\u00C9\u00D1\u00D6\u00DC\u00E1\u00E0\u00E2\u00E4\u00E3\u00E5\u00E7\u00E9\u00E8\u00EA\u00EB\u00ED\u00EC\u00EE\u00EF\u00F1\u00F3\u00F2\u00F4\u00F6\u00F5\u00FA\u00F9\u00FB\u00FC\u2020\u00B0\u00A2\u00A3\u00A7\u2022\u00B6\u00DF\u00AE\u0160\u2122\u00B4\u00A8\u2260\u017D\u00D8\u221E\u00B1\u2264\u2265\u2206\u00B5\u2202\u2211\u220F\u0161\u222B\u00AA\u00BA\u03A9\u017E\u00F8\u00BF\u00A1\u00AC\u221A\u0192\u2248\u0106\u00AB\u010C\u2026 \u00C0\u00C3\u00D5\u0152\u0153\u0110\u2014\u201C\u201D\u2018\u2019\u00F7\u25CA\uF8FF\u00A9\u2044\u20AC\u2039\u203A\u00C6\u00BB\u2013\u00B7\u201A\u201E\u2030\u00C2\u0107\u00C1\u010D\u00C8\u00CD\u00CE\u00CF\u00CC\u00D3\u00D4\u0111\u00D2\u00DA\u00DB\u00D9\u0131\u02C6\u02DC\u00AF\u03C0\u00CB\u02DA\u00B8\u00CA\u00E6\u02C7',\n 'x-mac-gaelic': '\u00C4\u00C5\u00C7\u00C9\u00D1\u00D6\u00DC\u00E1\u00E0\u00E2\u00E4\u00E3\u00E5\u00E7\u00E9\u00E8\u00EA\u00EB\u00ED\u00EC\u00EE\u00EF\u00F1\u00F3\u00F2\u00F4\u00F6\u00F5\u00FA\u00F9\u00FB\u00FC\u2020\u00B0\u00A2\u00A3\u00A7\u2022\u00B6\u00DF\u00AE\u00A9\u2122\u00B4\u00A8\u2260\u00C6\u00D8\u1E02\u00B1\u2264\u2265\u1E03\u010A\u010B\u1E0A\u1E0B\u1E1E\u1E1F\u0120\u0121\u1E40\u00E6\u00F8\u1E41\u1E56\u1E57\u027C\u0192\u017F\u1E60\u00AB\u00BB\u2026 \u00C0\u00C3\u00D5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\u1E61\u1E9B\u00FF\u0178\u1E6A\u20AC\u2039\u203A\u0176\u0177\u1E6B\u00B7\u1EF2\u1EF3\u204A\u00C2\u00CA\u00C1\u00CB\u00C8\u00CD\u00CE\u00CF\u00CC\u00D3\u00D4\u2663\u00D2\u00DA\u00DB\u00D9\u0131\u00DD\u00FD\u0174\u0175\u1E84\u1E85\u1E80\u1E81\u1E82\u1E83',\n 'x-mac-greek': '\u00C4\u00B9\u00B2\u00C9\u00B3\u00D6\u00DC\u0385\u00E0\u00E2\u00E4\u0384\u00A8\u00E7\u00E9\u00E8\u00EA\u00EB\u00A3\u2122\u00EE\u00EF\u2022\u00BD\u2030\u00F4\u00F6\u00A6\u20AC\u00F9\u00FB\u00FC\u2020\u0393\u0394\u0398\u039B\u039E\u03A0\u00DF\u00AE\u00A9\u03A3\u03AA\u00A7\u2260\u00B0\u00B7\u0391\u00B1\u2264\u2265\u00A5\u0392\u0395\u0396\u0397\u0399\u039A\u039C\u03A6\u03AB\u03A8\u03A9\u03AC\u039D\u00AC\u039F\u03A1\u2248\u03A4\u00AB\u00BB\u2026 \u03A5\u03A7\u0386\u0388\u0153\u2013\u2015\u201C\u201D\u2018\u2019\u00F7\u0389\u038A\u038C\u038E\u03AD\u03AE\u03AF\u03CC\u038F\u03CD\u03B1\u03B2\u03C8\u03B4\u03B5\u03C6\u03B3\u03B7\u03B9\u03BE\u03BA\u03BB\u03BC\u03BD\u03BF\u03C0\u03CE\u03C1\u03C3\u03C4\u03B8\u03C9\u03C2\u03C7\u03C5\u03B6\u03CA\u03CB\u0390\u03B0\\u00AD',\n 'x-mac-icelandic': '\u00C4\u00C5\u00C7\u00C9\u00D1\u00D6\u00DC\u00E1\u00E0\u00E2\u00E4\u00E3\u00E5\u00E7\u00E9\u00E8\u00EA\u00EB\u00ED\u00EC\u00EE\u00EF\u00F1\u00F3\u00F2\u00F4\u00F6\u00F5\u00FA\u00F9\u00FB\u00FC\u00DD\u00B0\u00A2\u00A3\u00A7\u2022\u00B6\u00DF\u00AE\u00A9\u2122\u00B4\u00A8\u2260\u00C6\u00D8\u221E\u00B1\u2264\u2265\u00A5\u00B5\u2202\u2211\u220F\u03C0\u222B\u00AA\u00BA\u03A9\u00E6\u00F8\u00BF\u00A1\u00AC\u221A\u0192\u2248\u2206\u00AB\u00BB\u2026 \u00C0\u00C3\u00D5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\u00F7\u25CA\u00FF\u0178\u2044\u20AC\u00D0\u00F0\u00DE\u00FE\u00FD\u00B7\u201A\u201E\u2030\u00C2\u00CA\u00C1\u00CB\u00C8\u00CD\u00CE\u00CF\u00CC\u00D3\u00D4\uF8FF\u00D2\u00DA\u00DB\u00D9\u0131\u02C6\u02DC\u00AF\u02D8\u02D9\u02DA\u00B8\u02DD\u02DB\u02C7',\n 'x-mac-inuit': '\u1403\u1404\u1405\u1406\u140A\u140B\u1431\u1432\u1433\u1434\u1438\u1439\u1449\u144E\u144F\u1450\u1451\u1455\u1456\u1466\u146D\u146E\u146F\u1470\u1472\u1473\u1483\u148B\u148C\u148D\u148E\u1490\u1491\u00B0\u14A1\u14A5\u14A6\u2022\u00B6\u14A7\u00AE\u00A9\u2122\u14A8\u14AA\u14AB\u14BB\u14C2\u14C3\u14C4\u14C5\u14C7\u14C8\u14D0\u14EF\u14F0\u14F1\u14F2\u14F4\u14F5\u1505\u14D5\u14D6\u14D7\u14D8\u14DA\u14DB\u14EA\u1528\u1529\u152A\u152B\u152D\u2026 \u152E\u153E\u1555\u1556\u1557\u2013\u2014\u201C\u201D\u2018\u2019\u1558\u1559\u155A\u155D\u1546\u1547\u1548\u1549\u154B\u154C\u1550\u157F\u1580\u1581\u1582\u1583\u1584\u1585\u158F\u1590\u1591\u1592\u1593\u1594\u1595\u1671\u1672\u1673\u1674\u1675\u1676\u1596\u15A0\u15A1\u15A2\u15A3\u15A4\u15A5\u15A6\u157C\u0141\u0142',\n 'x-mac-ce': '\u00C4\u0100\u0101\u00C9\u0104\u00D6\u00DC\u00E1\u0105\u010C\u00E4\u010D\u0106\u0107\u00E9\u0179\u017A\u010E\u00ED\u010F\u0112\u0113\u0116\u00F3\u0117\u00F4\u00F6\u00F5\u00FA\u011A\u011B\u00FC\u2020\u00B0\u0118\u00A3\u00A7\u2022\u00B6\u00DF\u00AE\u00A9\u2122\u0119\u00A8\u2260\u0123\u012E\u012F\u012A\u2264\u2265\u012B\u0136\u2202\u2211\u0142\u013B\u013C\u013D\u013E\u0139\u013A\u0145\u0146\u0143\u00AC\u221A\u0144\u0147\u2206\u00AB\u00BB\u2026 \u0148\u0150\u00D5\u0151\u014C\u2013\u2014\u201C\u201D\u2018\u2019\u00F7\u25CA\u014D\u0154\u0155\u0158\u2039\u203A\u0159\u0156\u0157\u0160\u201A\u201E\u0161\u015A\u015B\u00C1\u0164\u0165\u00CD\u017D\u017E\u016A\u00D3\u00D4\u016B\u016E\u00DA\u016F\u0170\u0171\u0172\u0173\u00DD\u00FD\u0137\u017B\u0141\u017C\u0122\u02C7',\n 'x-mac-romanian': '\u00C4\u00C5\u00C7\u00C9\u00D1\u00D6\u00DC\u00E1\u00E0\u00E2\u00E4\u00E3\u00E5\u00E7\u00E9\u00E8\u00EA\u00EB\u00ED\u00EC\u00EE\u00EF\u00F1\u00F3\u00F2\u00F4\u00F6\u00F5\u00FA\u00F9\u00FB\u00FC\u2020\u00B0\u00A2\u00A3\u00A7\u2022\u00B6\u00DF\u00AE\u00A9\u2122\u00B4\u00A8\u2260\u0102\u0218\u221E\u00B1\u2264\u2265\u00A5\u00B5\u2202\u2211\u220F\u03C0\u222B\u00AA\u00BA\u03A9\u0103\u0219\u00BF\u00A1\u00AC\u221A\u0192\u2248\u2206\u00AB\u00BB\u2026 \u00C0\u00C3\u00D5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\u00F7\u25CA\u00FF\u0178\u2044\u20AC\u2039\u203A\u021A\u021B\u2021\u00B7\u201A\u201E\u2030\u00C2\u00CA\u00C1\u00CB\u00C8\u00CD\u00CE\u00CF\u00CC\u00D3\u00D4\uF8FF\u00D2\u00DA\u00DB\u00D9\u0131\u02C6\u02DC\u00AF\u02D8\u02D9\u02DA\u00B8\u02DD\u02DB\u02C7',\n 'x-mac-turkish': '\u00C4\u00C5\u00C7\u00C9\u00D1\u00D6\u00DC\u00E1\u00E0\u00E2\u00E4\u00E3\u00E5\u00E7\u00E9\u00E8\u00EA\u00EB\u00ED\u00EC\u00EE\u00EF\u00F1\u00F3\u00F2\u00F4\u00F6\u00F5\u00FA\u00F9\u00FB\u00FC\u2020\u00B0\u00A2\u00A3\u00A7\u2022\u00B6\u00DF\u00AE\u00A9\u2122\u00B4\u00A8\u2260\u00C6\u00D8\u221E\u00B1\u2264\u2265\u00A5\u00B5\u2202\u2211\u220F\u03C0\u222B\u00AA\u00BA\u03A9\u00E6\u00F8\u00BF\u00A1\u00AC\u221A\u0192\u2248\u2206\u00AB\u00BB\u2026 \u00C0\u00C3\u00D5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\u00F7\u25CA\u00FF\u0178\u011E\u011F\u0130\u0131\u015E\u015F\u2021\u00B7\u201A\u201E\u2030\u00C2\u00CA\u00C1\u00CB\u00C8\u00CD\u00CE\u00CF\u00CC\u00D3\u00D4\uF8FF\u00D2\u00DA\u00DB\u00D9\uF8A0\u02C6\u02DC\u00AF\u02D8\u02D9\u02DA\u00B8\u02DD\u02DB\u02C7'\n};\n\n/** @type {Map<string, Map<number, number>>} */\nconst encodingCache = new Map();\n\n/**\n * @param {string} encoding\n * @returns {Map<number, number> | undefined}\n */\nexport function getEncodingMapping(encoding) {\n let cached = encodingCache.get(encoding);\n if (cached) {\n return cached;\n }\n\n // These encodings aren't supported by TextDecoder.\n let mapping = MAC_ENCODINGS[encoding];\n if (mapping) {\n let res = new Map();\n for (let i = 0; i < mapping.length; i++) {\n res.set(mapping.charCodeAt(i), 0x80 + i);\n }\n\n encodingCache.set(encoding, res);\n return res;\n }\n\n // Only single byte encodings can be mapped 1:1.\n if (SINGLE_BYTE_ENCODINGS.has(encoding)) {\n // TextEncoder only supports utf8, whereas TextDecoder supports legacy encodings.\n // Use this to create a mapping of code points.\n let decoder = new TextDecoder(encoding);\n let bytes = new Uint8Array(0x80);\n for (let i = 0; i < 0x80; i++) {\n bytes[i] = 0x80 + i;\n }\n\n let res = new Map();\n let s = decoder.decode(bytes);\n for (let i = 0; i < 0x80; i++) {\n res.set(s.charCodeAt(i), 0x80 + i);\n }\n\n encodingCache.set(encoding, res);\n return res;\n }\n\n return undefined;\n}\n\n// Map of platform ids to encoding ids.\n/** @type {(string | null)[][]} */\nexport const ENCODINGS = [\n // unicode\n ['utf-16be', 'utf-16be', 'utf-16be', 'utf-16be', 'utf-16be', 'utf-16be', 'utf-16be'],\n\n // macintosh\n // Mappings available at http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/\n // 0 Roman 17 Malayalam\n // 1 Japanese 18 Sinhalese\n // 2 Traditional Chinese 19 Burmese\n // 3 Korean 20 Khmer\n // 4 Arabic 21 Thai\n // 5 Hebrew 22 Laotian\n // 6 Greek 23 Georgian\n // 7 Russian 24 Armenian\n // 8 RSymbol 25 Simplified Chinese\n // 9 Devanagari 26 Tibetan\n // 10 Gurmukhi 27 Mongolian\n // 11 Gujarati 28 Geez\n // 12 Oriya 29 Slavic\n // 13 Bengali 30 Vietnamese\n // 14 Tamil 31 Sindhi\n // 15 Telugu 32 (Uninterpreted)\n // 16 Kannada\n ['x-mac-roman', 'shift-jis', 'big5', 'euc-kr', 'iso-8859-6', 'iso-8859-8',\n 'x-mac-greek', 'x-mac-cyrillic', 'x-mac-symbol', 'x-mac-devanagari', 'x-mac-gurmukhi', 'x-mac-gujarati',\n 'Oriya', 'Bengali', 'Tamil', 'Telugu', 'Kannada', 'Malayalam', 'Sinhalese',\n 'Burmese', 'Khmer', 'iso-8859-11', 'Laotian', 'Georgian', 'Armenian', 'gbk',\n 'Tibetan', 'Mongolian', 'Geez', 'x-mac-ce', 'Vietnamese', 'Sindhi'],\n\n // ISO (deprecated)\n ['ascii', null, 'iso-8859-1'],\n\n // windows\n // Docs here: http://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx\n ['symbol', 'utf-16be', 'shift-jis', 'gb18030', 'big5', 'euc-kr', 'johab', null, null, null, 'utf-16be']\n];\n\n// Overrides for Mac scripts by language id.\n// See http://unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt\n/** @type {Record<number, string>} */\nexport const MAC_LANGUAGE_ENCODINGS = {\n 15: 'x-mac-icelandic',\n 17: 'x-mac-turkish',\n 18: 'x-mac-croatian',\n 24: 'x-mac-ce',\n 25: 'x-mac-ce',\n 26: 'x-mac-ce',\n 27: 'x-mac-ce',\n 28: 'x-mac-ce',\n 30: 'x-mac-icelandic',\n 37: 'x-mac-romanian',\n 38: 'x-mac-ce',\n 39: 'x-mac-ce',\n 40: 'x-mac-ce',\n 143: 'x-mac-inuit',\n 146: 'x-mac-gaelic'\n};\n\n// Map of platform ids to BCP-47 language codes.\n/** @type {Array<Record<number, string>>} */\nexport const LANGUAGES = [\n // unicode\n {},\n\n { // macintosh\n 0: 'en', 30: 'fo', 60: 'ks', 90: 'rw',\n 1: 'fr', 31: 'fa', 61: 'ku', 91: 'rn',\n 2: 'de', 32: 'ru', 62: 'sd', 92: 'ny',\n 3: 'it', 33: 'zh', 63: 'bo', 93: 'mg',\n 4: 'nl', 34: 'nl-BE', 64: 'ne', 94: 'eo',\n 5: 'sv', 35: 'ga', 65: 'sa', 128: 'cy',\n 6: 'es', 36: 'sq', 66: 'mr', 129: 'eu',\n 7: 'da', 37: 'ro', 67: 'bn', 130: 'ca',\n 8: 'pt', 38: 'cz', 68: 'as', 131: 'la',\n 9: 'no', 39: 'sk', 69: 'gu', 132: 'qu',\n 10: 'he', 40: 'si', 70: 'pa', 133: 'gn',\n 11: 'ja', 41: 'yi', 71: 'or', 134: 'ay',\n 12: 'ar', 42: 'sr', 72: 'ml', 135: 'tt',\n 13: 'fi', 43: 'mk', 73: 'kn', 136: 'ug',\n 14: 'el', 44: 'bg', 74: 'ta', 137: 'dz',\n 15: 'is', 45: 'uk', 75: 'te', 138: 'jv',\n 16: 'mt', 46: 'be', 76: 'si', 139: 'su',\n 17: 'tr', 47: 'uz', 77: 'my', 140: 'gl',\n 18: 'hr', 48: 'kk', 78: 'km', 141: 'af',\n 19: 'zh-Hant', 49: 'az-Cyrl', 79: 'lo', 142: 'br',\n 20: 'ur', 50: 'az-Arab', 80: 'vi', 143: 'iu',\n 21: 'hi', 51: 'hy', 81: 'id', 144: 'gd',\n 22: 'th', 52: 'ka', 82: 'tl', 145: 'gv',\n 23: 'ko', 53: 'mo', 83: 'ms', 146: 'ga',\n 24: 'lt', 54: 'ky', 84: 'ms-Arab', 147: 'to',\n 25: 'pl', 55: 'tg', 85: 'am', 148: 'el-polyton',\n 26: 'hu', 56: 'tk', 86: 'ti', 149: 'kl',\n 27: 'es', 57: 'mn-CN', 87: 'om', 150: 'az',\n 28: 'lv', 58: 'mn', 88: 'so', 151: 'nn',\n 29: 'se', 59: 'ps', 89: 'sw'\n },\n\n // ISO (deprecated)\n {},\n\n { // windows\n 0x0436: 'af', 0x4009: 'en-IN', 0x0487: 'rw', 0x0432: 'tn',\n 0x041C: 'sq', 0x1809: 'en-IE', 0x0441: 'sw', 0x045B: 'si',\n 0x0484: 'gsw', 0x2009: 'en-JM', 0x0457: 'kok', 0x041B: 'sk',\n 0x045E: 'am', 0x4409: 'en-MY', 0x0412: 'ko', 0x0424: 'sl',\n 0x1401: 'ar-DZ', 0x1409: 'en-NZ', 0x0440: 'ky', 0x2C0A: 'es-AR',\n 0x3C01: 'ar-BH', 0x3409: 'en-PH', 0x0454: 'lo', 0x400A: 'es-BO',\n 0x0C01: 'ar', 0x4809: 'en-SG', 0x0426: 'lv', 0x340A: 'es-CL',\n 0x0801: 'ar-IQ', 0x1C09: 'en-ZA', 0x0427: 'lt', 0x240A: 'es-CO',\n 0x2C01: 'ar-JO', 0x2C09: 'en-TT', 0x082E: 'dsb', 0x140A: 'es-CR',\n 0x3401: 'ar-KW', 0x0809: 'en-GB', 0x046E: 'lb', 0x1C0A: 'es-DO',\n 0x3001: 'ar-LB', 0x0409: 'en', 0x042F: 'mk', 0x300A: 'es-EC',\n 0x1001: 'ar-LY', 0x3009: 'en-ZW', 0x083E: 'ms-BN', 0x440A: 'es-SV',\n 0x1801: 'ary', 0x0425: 'et', 0x043E: 'ms', 0x100A: 'es-GT',\n 0x2001: 'ar-OM', 0x0438: 'fo', 0x044C: 'ml', 0x480A: 'es-HN',\n 0x4001: 'ar-QA', 0x0464: 'fil', 0x043A: 'mt', 0x080A: 'es-MX',\n 0x0401: 'ar-SA', 0x040B: 'fi', 0x0481: 'mi', 0x4C0A: 'es-NI',\n 0x2801: 'ar-SY', 0x080C: 'fr-BE', 0x047A: 'arn', 0x180A: 'es-PA',\n 0x1C01: 'aeb', 0x0C0C: 'fr-CA', 0x044E: 'mr', 0x3C0A: 'es-PY',\n 0x3801: 'ar-AE', 0x040C: 'fr', 0x047C: 'moh', 0x280A: 'es-PE',\n 0x2401: 'ar-YE', 0x140C: 'fr-LU', 0x0450: 'mn', 0x500A: 'es-PR',\n 0x042B: 'hy', 0x180C: 'fr-MC', 0x0850: 'mn-CN', 0x0C0A: 'es',\n 0x044D: 'as', 0x100C: 'fr-CH', 0x0461: 'ne', 0x040A: 'es',\n 0x082C: 'az-Cyrl', 0x0462: 'fy', 0x0414: 'nb', 0x540A: 'es-US',\n 0x042C: 'az', 0x0456: 'gl', 0x0814: 'nn', 0x380A: 'es-UY',\n 0x046D: 'ba', 0x0437: 'ka', 0x0482: 'oc', 0x200A: 'es-VE',\n 0x042D: 'eu', 0x0C07: 'de-AT', 0x0448: 'or', 0x081D: 'sv-FI',\n 0x0423: 'be', 0x0407: 'de', 0x0463: 'ps', 0x041D: 'sv',\n 0x0845: 'bn', 0x1407: 'de-LI', 0x0415: 'pl', 0x045A: 'syr',\n 0x0445: 'bn-IN', 0x1007: 'de-LU', 0x0416: 'pt', 0x0428: 'tg',\n 0x201A: 'bs-Cyrl', 0x0807: 'de-CH', 0x0816: 'pt-PT', 0x085F: 'tzm',\n 0x141A: 'bs', 0x0408: 'el', 0x0446: 'pa', 0x0449: 'ta',\n 0x047E: 'br', 0x046F: 'kl', 0x046B: 'qu-BO', 0x0444: 'tt',\n 0x0402: 'bg', 0x0447: 'gu', 0x086B: 'qu-EC', 0x044A: 'te',\n 0x0403: 'ca', 0x0468: 'ha', 0x0C6B: 'qu', 0x041E: 'th',\n 0x0C04: 'zh-HK', 0x040D: 'he', 0x0418: 'ro', 0x0451: 'bo',\n 0x1404: 'zh-MO', 0x0439: 'hi', 0x0417: 'rm', 0x041F: 'tr',\n 0x0804: 'zh', 0x040E: 'hu', 0x0419: 'ru', 0x0442: 'tk',\n 0x1004: 'zh-SG', 0x040F: 'is', 0x243B: 'smn', 0x0480: 'ug',\n 0x0404: 'zh-TW', 0x0470: 'ig', 0x103B: 'smj-NO', 0x0422: 'uk',\n 0x0483: 'co', 0x0421: 'id', 0x143B: 'smj', 0x042E: 'hsb',\n 0x041A: 'hr', 0x045D: 'iu', 0x0C3B: 'se-FI', 0x0420: 'ur',\n 0x101A: 'hr-BA', 0x085D: 'iu-Latn', 0x043B: 'se', 0x0843: 'uz-Cyrl',\n 0x0405: 'cs', 0x083C: 'ga', 0x083B: 'se-SE', 0x0443: 'uz',\n 0x0406: 'da', 0x0434: 'xh', 0x203B: 'sms', 0x042A: 'vi',\n 0x048C: 'prs', 0x0435: 'zu', 0x183B: 'sma-NO', 0x0452: 'cy',\n 0x0465: 'dv', 0x0410: 'it', 0x1C3B: 'sms', 0x0488: 'wo',\n 0x0813: 'nl-BE', 0x0810: 'it-CH', 0x044F: 'sa', 0x0485: 'sah',\n 0x0413: 'nl', 0x0411: 'ja', 0x1C1A: 'sr-Cyrl-BA', 0x0478: 'ii',\n 0x0C09: 'en-AU', 0x044B: 'kn', 0x0C1A: 'sr', 0x046A: 'yo',\n 0x2809: 'en-BZ', 0x043F: 'kk', 0x181A: 'sr-Latn-BA',\n 0x1009: 'en-CA', 0x0453: 'km', 0x081A: 'sr-Latn',\n 0x2409: 'en-029', 0x0486: 'quc', 0x046C: 'nso'\n }\n];\n", "import * as r from 'restructure';\nimport { getEncoding, LANGUAGES } from '../encodings';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\n/**\n * @typedef {{\n * platformID: number,\n * encodingID: number,\n * languageID: number,\n * nameID: number,\n * length: number,\n * string: string\n * }} NameRecordValue\n */\n\n/**\n * @typedef {Record<string, string | unknown>} LangStringMap\n */\n\n/**\n * @typedef {{\n * fontFeatures: Record<number, LangStringMap>,\n * reservedNameID?: Record<number, LangStringMap>,\n * [key: string]: LangStringMap | Record<number, LangStringMap> | undefined\n * }} NameRecordsMap\n */\n\n/**\n * @typedef {StructValue & {\n * version: number,\n * count: number,\n * stringOffset: number,\n * records: NameRecordValue[] | NameRecordsMap,\n * langTags?: Array<{ tag: string }>\n * }} NameTableValue\n */\n\nlet NameRecord = new r.Struct({\n platformID: r.uint16,\n encodingID: r.uint16,\n languageID: r.uint16,\n nameID: r.uint16,\n length: r.uint16,\n string: new r.Pointer(\n r.uint16,\n new r.String(\n 'length',\n /** @param {StructValue} t @returns {string} */\n t => getEncoding(\n /** @type {number} */ (t.platformID),\n /** @type {number} */ (t.encodingID),\n /** @type {number} */ (t.languageID)\n ) || 'utf16be'\n ),\n {\n type: 'parent',\n /** @param {StructValue} ctx @returns {number} */\n relativeTo: ctx => /** @type {number} */ (/** @type {StructValue} */ (ctx.parent).stringOffset),\n allowNull: false\n }\n )\n});\n\nlet LangTagRecord = new r.Struct({\n length: r.uint16,\n tag: new r.Pointer(\n r.uint16,\n new r.String('length', 'utf16be'),\n {\n type: 'parent',\n /** @param {StructValue} ctx @returns {number} */\n relativeTo: ctx => /** @type {number} */ (ctx.stringOffset)\n }\n )\n});\n\n/** @type {import('restructure').VersionedStruct} */\nvar NameTable = new r.VersionedStruct(r.uint16, {\n 0: {\n count: r.uint16,\n stringOffset: r.uint16,\n records: new r.Array(NameRecord, 'count')\n },\n 1: {\n count: r.uint16,\n stringOffset: r.uint16,\n records: new r.Array(NameRecord, 'count'),\n langTagCount: r.uint16,\n langTags: new r.Array(LangTagRecord, 'langTagCount')\n }\n});\n\nexport default NameTable;\n\nconst NAMES = [\n 'copyright',\n 'fontFamily',\n 'fontSubfamily',\n 'uniqueSubfamily',\n 'fullName',\n 'version',\n 'postscriptName', // Note: A font may have only one PostScript name and that name must be ASCII.\n 'trademark',\n 'manufacturer',\n 'designer',\n 'description',\n 'vendorURL',\n 'designerURL',\n 'license',\n 'licenseURL',\n null, // reserved (nameID 15)\n 'preferredFamily',\n 'preferredSubfamily',\n 'compatibleFull',\n 'sampleText',\n 'postscriptCIDFontName',\n 'wwsFamilyName',\n 'wwsSubfamilyName',\n 'lightBackgroundPalette',\n 'darkBackgroundPalette',\n 'variationsPostScriptNamePrefix'\n];\n\n/**\n * @param {NameRecordValue[]} out\n * @param {number} nameID\n * @param {unknown} string\n * @returns {void}\n */\nfunction pushEnRecord(out, nameID, string) {\n if (typeof string !== 'string') return;\n\n out.push({\n platformID: 3,\n encodingID: 1,\n languageID: 0x409,\n nameID,\n length: string.length * 2,\n string\n });\n}\n\nNameTable.process = function (_stream) {\n let self = /** @type {NameTableValue} */ (this);\n /** @type {NameRecordsMap} */\n let records = { fontFeatures: {} };\n\n for (let record of /** @type {NameRecordValue[]} */ (self.records)) {\n let platformMap = LANGUAGES[record.platformID] || {};\n /** @type {string | undefined} */\n let language = platformMap[record.languageID];\n\n if (language == null && self.langTags != null && record.languageID >= 0x8000) {\n language = self.langTags[record.languageID - 0x8000].tag;\n }\n\n if (language == null) {\n language = record.platformID + '-' + record.languageID;\n }\n\n // Single store keyed by nameID (feat/fvar look up fontFeatures[id]).\n let byId = records.fontFeatures[record.nameID] || (records.fontFeatures[record.nameID] = {});\n if (typeof record.string === 'string' || typeof byId[language] !== 'string') {\n byId[language] = record.string;\n }\n\n // Alias standard / reserved IDs onto friendly keys (same object).\n if (record.nameID >= 256) continue;\n\n let name = NAMES[record.nameID];\n if (name) {\n records[name] = byId;\n } else {\n if (records.reservedNameID == null) records.reservedNameID = {};\n records.reservedNameID[record.nameID] = byId;\n }\n }\n\n self.records = records;\n};\n\nNameTable.preEncode = function () {\n let self = /** @type {NameTableValue} */ (this);\n if (Array.isArray(self.records)) return;\n self.version = 0;\n\n /** @type {NameRecordValue[]} */\n let records = [];\n /** @type {NameRecordsMap} */\n let map = self.records;\n for (let key of Object.keys(map)) {\n let val = map[key];\n\n if (key === 'fontFeatures') {\n // Mirrors of IDs < 256 are encoded via named/reserved keys above.\n let features = /** @type {Record<number, LangStringMap>} */ (val);\n for (let id of Object.keys(features)) {\n if (+id >= 256) {\n let langs = features[+id];\n pushEnRecord(records, +id, langs && langs.en);\n }\n }\n continue;\n }\n\n if (key === 'reservedNameID') {\n let reserved = /** @type {Record<number, LangStringMap>} */ (val);\n for (let id of Object.keys(reserved)) {\n let langs = reserved[+id];\n pushEnRecord(records, +id, langs && langs.en);\n }\n continue;\n }\n\n let nameID = NAMES.indexOf(key);\n if (nameID < 0) continue;\n\n let langs = /** @type {LangStringMap} */ (val);\n pushEnRecord(records, nameID, langs.en);\n\n // Match historical behaviour: also write PostScript name for Mac platform.\n if (key === 'postscriptName' && typeof langs.en === 'string') {\n records.push({\n platformID: 1,\n encodingID: 0,\n languageID: 0,\n nameID,\n length: langs.en.length,\n string: langs.en\n });\n }\n }\n\n self.records = records;\n self.count = records.length;\n self.stringOffset = NameTable.size(self, null, false);\n};\n", "import * as r from 'restructure';\n\n/** @type {import('restructure').VersionedStruct} */\nvar OS2 = new r.VersionedStruct(r.uint16, {\n header: {\n xAvgCharWidth: r.int16, // average weighted advance width of lower case letters and space\n usWeightClass: r.uint16, // visual weight of stroke in glyphs\n usWidthClass: r.uint16, // relative change from the normal aspect ratio (width to height ratio)\n fsType: new r.Bitfield(r.uint16, [ // Indicates font embedding licensing rights\n null, 'noEmbedding', 'viewOnly', 'editable', null,\n null, null, null, 'noSubsetting', 'bitmapOnly'\n ]),\n ySubscriptXSize: r.int16, // recommended horizontal size in pixels for subscripts\n ySubscriptYSize: r.int16, // recommended vertical size in pixels for subscripts\n ySubscriptXOffset: r.int16, // recommended horizontal offset for subscripts\n ySubscriptYOffset: r.int16, // recommended vertical offset form the baseline for subscripts\n ySuperscriptXSize: r.int16, // recommended horizontal size in pixels for superscripts\n ySuperscriptYSize: r.int16, // recommended vertical size in pixels for superscripts\n ySuperscriptXOffset: r.int16, // recommended horizontal offset for superscripts\n ySuperscriptYOffset: r.int16, // recommended vertical offset from the baseline for superscripts\n yStrikeoutSize: r.int16, // width of the strikeout stroke\n yStrikeoutPosition: r.int16, // position of the strikeout stroke relative to the baseline\n sFamilyClass: r.int16, // classification of font-family design\n panose: new r.Array(r.uint8, 10), // describe the visual characteristics of a given typeface\n ulCharRange: new r.Array(r.uint32, 4),\n vendorID: new r.String(4), // four character identifier for the font vendor\n fsSelection: new r.Bitfield(r.uint16, [ // bit field containing information about the font\n 'italic', 'underscore', 'negative', 'outlined', 'strikeout',\n 'bold', 'regular', 'useTypoMetrics', 'wws', 'oblique'\n ]),\n usFirstCharIndex: r.uint16, // The minimum Unicode index in this font\n usLastCharIndex: r.uint16 // The maximum Unicode index in this font\n },\n\n // The Apple version of this table ends here, but the Microsoft one continues on...\n 0: {},\n\n 1: {\n typoAscender: r.int16,\n typoDescender: r.int16,\n typoLineGap: r.int16,\n winAscent: r.uint16,\n winDescent: r.uint16,\n codePageRange: new r.Array(r.uint32, 2)\n },\n\n 2: {\n // these should be common with version 1 somehow\n typoAscender: r.int16,\n typoDescender: r.int16,\n typoLineGap: r.int16,\n winAscent: r.uint16,\n winDescent: r.uint16,\n codePageRange: new r.Array(r.uint32, 2),\n\n xHeight: r.int16,\n capHeight: r.int16,\n defaultChar: r.uint16,\n breakChar: r.uint16,\n maxContent: r.uint16\n },\n\n 5: {\n typoAscender: r.int16,\n typoDescender: r.int16,\n typoLineGap: r.int16,\n winAscent: r.uint16,\n winDescent: r.uint16,\n codePageRange: new r.Array(r.uint32, 2),\n\n xHeight: r.int16,\n capHeight: r.int16,\n defaultChar: r.uint16,\n breakChar: r.uint16,\n maxContent: r.uint16,\n\n usLowerOpticalPointSize: r.uint16,\n usUpperOpticalPointSize: r.uint16\n }\n});\n\nlet versions = OS2.versions;\nversions[3] = versions[4] = versions[2];\n\nexport default OS2;\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\n// PostScript information\n/** @type {import('restructure').VersionedStruct} */\nexport default new r.VersionedStruct(r.fixed32, {\n header: { // these fields exist at the top of all versions\n italicAngle: r.fixed32, // Italic angle in counter-clockwise degrees from the vertical.\n underlinePosition: r.int16, // Suggested distance of the top of the underline from the baseline\n underlineThickness: r.int16, // Suggested values for the underline thickness\n isFixedPitch: r.uint32, // Whether the font is monospaced\n minMemType42: r.uint32, // Minimum memory usage when a TrueType font is downloaded as a Type 42 font\n maxMemType42: r.uint32, // Maximum memory usage when a TrueType font is downloaded as a Type 42 font\n minMemType1: r.uint32, // Minimum memory usage when a TrueType font is downloaded as a Type 1 font\n maxMemType1: r.uint32 // Maximum memory usage when a TrueType font is downloaded as a Type 1 font\n },\n\n 1: {}, // version 1 has no additional fields\n\n 2: {\n numberOfGlyphs: r.uint16,\n glyphNameIndex: new r.Array(r.uint16, 'numberOfGlyphs'),\n names: new r.Array(new r.String(r.uint8))\n },\n\n 2.5: {\n numberOfGlyphs: r.uint16,\n offsets: new r.Array(r.uint8, 'numberOfGlyphs')\n },\n\n 3: {}, // version 3 has no additional fields\n\n 4: {\n map: new r.Array(\n r.uint32,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (/** @type {StructValue} */ (/** @type {StructValue} */ (t.parent).maxp).numGlyphs)\n )\n }\n});\n", "import * as r from 'restructure';\n\n// An array of predefined values accessible by instructions\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n controlValues: new r.Array(r.int16)\n});\n", "import * as r from 'restructure';\n\n// A list of instructions that are executed once when a font is first used.\n// These instructions are known as the font program. The main use of this table\n// is for the definition of functions that are used in many different glyph programs.\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n instructions: new r.Array(r.uint8)\n});\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\n/**\n * @typedef {StructValue & {\n * version: number,\n * offsets: number[],\n * _processed?: boolean\n * }} LocaValue\n */\n\n/** @type {import('restructure').VersionedStruct} */\nlet loca = new r.VersionedStruct('head.indexToLocFormat', {\n 0: {\n offsets: new r.Array(r.uint16)\n },\n 1: {\n offsets: new r.Array(r.uint32)\n }\n});\n\nloca.process = function () {\n let self = /** @type {LocaValue} */ (this);\n if (self.version === 0 && !self._processed) {\n for (let i = 0; i < self.offsets.length; i++) {\n self.offsets[i] <<= 1;\n }\n self._processed = true;\n }\n};\n\nloca.preEncode = function () {\n let self = /** @type {LocaValue} */ (this);\n if (self.version === 0 && self._processed !== false) {\n for (let i = 0; i < self.offsets.length; i++) {\n self.offsets[i] >>>= 1;\n }\n self._processed = false;\n }\n};\n\nexport default loca;\n", "import * as r from 'restructure';\n\n// Set of instructions executed whenever the point size or font transformation change\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n controlValueProgram: new r.Array(r.uint8)\n});\n", "import * as r from 'restructure';\n\n// only used for encoding\n/** @type {import('restructure').ArrayT} */\nexport default new r.Array(new r.Buffer());\n", "import isEqual from 'fast-deep-equal';\nimport CFFOperand from './CFFOperand';\nimport { PropertyDescriptor } from 'restructure';\n\n/** @typedef {import('restructure').BaseType} BaseType */\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').EncodeStream} EncodeStream */\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('../../types/fontkit').CFFDictField} CFFDictField */\n/** @typedef {import('../../types/fontkit').CFFOperandType} CFFOperandType */\n/** @typedef {import('../../types/fontkit').CFFEncodeContext} CFFEncodeContext */\n\n/** @typedef {number | { forceLarge?: boolean, valueOf(): number }} CFFOperandValue */\n\n/**\n * @param {CFFOperandType} type\n * @returns {type is BaseType}\n */\nfunction isCodec(type) {\n return typeof type === 'object' && type != null && !Array.isArray(type);\n}\n\nexport default class CFFDict {\n /**\n * @param {CFFDictField[]} [ops]\n */\n constructor(ops = []) {\n /** @type {CFFDictField[]} */\n this.ops = ops;\n /** @type {Record<number, CFFDictField>} */\n this.fields = {};\n for (let field of ops) {\n let key = Array.isArray(field[0]) ? field[0][0] << 8 | field[0][1] : field[0];\n this.fields[key] = field;\n }\n }\n\n /**\n * @param {CFFOperandType} type\n * @param {DecodeStream} stream\n * @param {StructValue} ret\n * @param {unknown[]} operands\n * @returns {unknown}\n */\n decodeOperands(type, stream, ret, operands) {\n if (Array.isArray(type)) {\n return operands.map((op, i) => this.decodeOperands(type[i], stream, ret, [op]));\n } else if (isCodec(type) && type.decode != null) {\n return type.decode(stream, ret, operands);\n } else {\n switch (type) {\n case 'number':\n case 'offset':\n case 'sid':\n return operands[0];\n case 'boolean':\n return !!operands[0];\n default:\n return operands;\n }\n }\n }\n\n /**\n * @param {CFFOperandType} type\n * @param {EncodeStream | null} stream\n * @param {CFFEncodeContext | StructValue} ctx\n * @param {unknown} operands\n * @returns {unknown[]}\n */\n encodeOperands(type, stream, ctx, operands) {\n if (Array.isArray(type)) {\n if (!Array.isArray(operands)) {\n return [operands];\n }\n return operands.map((op, i) => this.encodeOperands(type[i], stream, ctx, op)[0]);\n } else if (isCodec(type) && type.encode != null) {\n let encoded = type.encode(stream, operands, ctx);\n if (Array.isArray(encoded)) {\n return encoded;\n }\n // Custom ops must return an operand list; coerce scalars (e.g. sid index).\n return [encoded];\n } else if (typeof operands === 'number') {\n return [operands];\n } else if (typeof operands === 'boolean') {\n return [+operands];\n } else if (Array.isArray(operands)) {\n return operands;\n } else {\n return [operands];\n }\n }\n\n /**\n * @param {DecodeStream} stream\n * @param {StructValue} parent\n * @returns {StructValue}\n */\n decode(stream, parent) {\n let dictLength = typeof parent.length === 'number' ? parent.length : 0;\n let end = stream.pos + dictLength;\n /** @type {StructValue} */\n let ret = {};\n /** @type {unknown[]} */\n let operands = [];\n\n // define hidden properties\n Object.defineProperties(ret, {\n parent: { value: parent },\n _startOffset: { value: stream.pos }\n });\n\n // fill in defaults\n for (let key in this.fields) {\n let field = this.fields[key];\n ret[field[1]] = field[3];\n }\n\n while (stream.pos < end) {\n let b = stream.readUInt8();\n if (b < 28) {\n if (b === 12) {\n b = (b << 8) | stream.readUInt8();\n }\n\n let field = this.fields[b];\n if (!field) {\n throw new Error(`Unknown operator ${b}`);\n }\n\n let val = this.decodeOperands(field[2], stream, ret, operands);\n if (val != null) {\n if (val instanceof PropertyDescriptor) {\n Object.defineProperty(ret, field[1], val);\n } else {\n ret[field[1]] = val;\n }\n }\n\n operands = [];\n } else {\n operands.push(CFFOperand.decode(stream, b));\n }\n }\n\n return ret;\n }\n\n /**\n * @param {StructValue} dict\n * @param {StructValue | CFFEncodeContext} parent\n * @param {boolean} [includePointers]\n * @returns {number}\n */\n size(dict, parent, includePointers = true) {\n /** @type {CFFEncodeContext} */\n let ctx = {\n parent,\n val: dict,\n pointerSize: 0,\n startOffset: (typeof parent.startOffset === 'number' ? parent.startOffset : 0),\n pointers: []\n };\n\n let len = 0;\n\n for (let k in this.fields) {\n let field = this.fields[k];\n let val = dict[field[1]];\n if (val == null || isEqual(val, field[3])) {\n continue;\n }\n\n let operands = this.encodeOperands(field[2], null, ctx, val);\n for (let op of operands) {\n len += CFFOperand.size(/** @type {CFFOperandValue} */ (op));\n }\n\n let key = Array.isArray(field[0]) ? field[0] : [field[0]];\n len += key.length;\n }\n\n if (includePointers) {\n len += ctx.pointerSize;\n }\n\n return len;\n }\n\n /**\n * @param {EncodeStream} stream\n * @param {StructValue} dict\n * @param {StructValue | null | undefined} parent\n * @returns {void}\n */\n encode(stream, dict, parent) {\n /** @type {CFFEncodeContext} */\n let ctx = {\n pointers: [],\n startOffset: stream.pos,\n parent: parent ?? undefined,\n val: dict,\n pointerSize: 0\n };\n\n ctx.pointerOffset = stream.pos + this.size(dict, ctx, false);\n\n for (let field of this.ops) {\n let val = dict[field[1]];\n if (val == null || isEqual(val, field[3])) {\n continue;\n }\n\n let operands = this.encodeOperands(field[2], stream, ctx, val);\n for (let op of operands) {\n CFFOperand.encode(stream, /** @type {CFFOperandValue} */ (op));\n }\n\n let key = Array.isArray(field[0]) ? field[0] : [field[0]];\n for (let op of key) {\n stream.writeUInt8(op);\n }\n }\n\n let i = 0;\n while (i < ctx.pointers.length) {\n let ptr = ctx.pointers[i++];\n if (ptr.type.encode) {\n ptr.type.encode(stream, ptr.val, ptr.parent);\n }\n }\n\n return;\n }\n}\n", "/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').EncodeStream} EncodeStream */\n\n/**\n * Operand value that may force a 32-bit encoding (e.g. CFF pointer placeholders).\n * @typedef {number | { forceLarge?: boolean, valueOf(): number }} CFFOperandValue\n */\n\nconst FLOAT_EOF = 0xf;\nconst FLOAT_LOOKUP = [\n '0', '1', '2', '3', '4', '5', '6', '7',\n '8', '9', '.', 'E', 'E-', null, '-'\n];\n\n/** @type {Record<string, number>} */\nconst FLOAT_ENCODE_LOOKUP = {\n '.': 10,\n E: 11,\n 'E-': 12,\n '-': 14\n};\n\nexport default class CFFOperand {\n /**\n * @param {DecodeStream} stream\n * @param {number} value\n * @returns {number | null}\n */\n static decode(stream, value) {\n if (32 <= value && value <= 246) {\n return value - 139;\n }\n\n if (247 <= value && value <= 250) {\n return (value - 247) * 256 + stream.readUInt8() + 108;\n }\n\n if (251 <= value && value <= 254) {\n return -(value - 251) * 256 - stream.readUInt8() - 108;\n }\n\n if (value === 28) {\n return stream.readInt16BE();\n }\n\n if (value === 29) {\n return stream.readInt32BE();\n }\n\n if (value === 30) {\n let str = '';\n while (true) {\n let b = stream.readUInt8();\n\n let n1 = b >> 4;\n if (n1 === FLOAT_EOF) { break; }\n str += FLOAT_LOOKUP[n1];\n\n let n2 = b & 15;\n if (n2 === FLOAT_EOF) { break; }\n str += FLOAT_LOOKUP[n2];\n }\n\n return parseFloat(str);\n }\n\n return null;\n }\n\n /**\n * @param {CFFOperandValue} value\n * @returns {number}\n */\n static size(value) {\n // if the value needs to be forced to the largest size (32 bit)\n // e.g. for unknown pointers, set to 32768\n /** @type {number} */\n let n;\n if (value && typeof value === 'object' && value.forceLarge) {\n n = 32768;\n } else {\n n = Number(value);\n }\n\n if ((n | 0) !== n) { // floating point\n let str = '' + n;\n return 1 + Math.ceil((str.length + 1) / 2);\n } else if (-107 <= n && n <= 107) {\n return 1;\n } else if (108 <= n && n <= 1131 || -1131 <= n && n <= -108) {\n return 2;\n } else if (-32768 <= n && n <= 32767) {\n return 3;\n } else {\n return 5;\n }\n }\n\n /**\n * @param {EncodeStream} stream\n * @param {CFFOperandValue} value\n * @returns {void}\n */\n static encode(stream, value) {\n // if the value needs to be forced to the largest size (32 bit)\n // e.g. for unknown pointers, save the old value and set to 32768\n let val = Number(value);\n\n if (value && typeof value === 'object' && value.forceLarge) {\n stream.writeUInt8(29);\n stream.writeInt32BE(val);\n return;\n } else if ((val | 0) !== val) { // floating point\n stream.writeUInt8(30);\n\n let str = '' + val;\n /** @type {number | undefined} */\n let n2;\n for (let i = 0; i < str.length; i += 2) {\n let c1 = str[i];\n let n1 = FLOAT_ENCODE_LOOKUP[c1] ?? (+c1);\n\n if (i === str.length - 1) {\n n2 = FLOAT_EOF;\n } else {\n let c2 = str[i + 1];\n n2 = FLOAT_ENCODE_LOOKUP[c2] ?? (+c2);\n }\n\n stream.writeUInt8((n1 << 4) | (n2 & 15));\n }\n\n if (n2 !== FLOAT_EOF) {\n stream.writeUInt8((FLOAT_EOF << 4));\n }\n return;\n } else if (-107 <= val && val <= 107) {\n stream.writeUInt8(val + 139);\n return;\n } else if (108 <= val && val <= 1131) {\n val -= 108;\n stream.writeUInt8((val >> 8) + 247);\n stream.writeUInt8(val & 0xff);\n return;\n } else if (-1131 <= val && val <= -108) {\n val = -val - 108;\n stream.writeUInt8((val >> 8) + 251);\n stream.writeUInt8(val & 0xff);\n return;\n } else if (-32768 <= val && val <= 32767) {\n stream.writeUInt8(28);\n stream.writeInt16BE(val);\n return;\n } else {\n stream.writeUInt8(29);\n stream.writeInt32BE(val);\n return;\n }\n }\n}\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').BaseType} BaseType */\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').EncodeStream} EncodeStream */\n/** @typedef {import('restructure').NumberT} NumberT */\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('../../types/fontkit').CFFCharString} CFFCharString */\n\nexport default class CFFIndex {\n /**\n * @param {BaseType} [type]\n */\n constructor(type) {\n /** @type {BaseType | undefined} */\n this.type = type;\n }\n\n /**\n * @param {StructValue | null | undefined} ctx\n * @returns {number}\n */\n getCFFVersion(ctx) {\n while (ctx && !ctx.hdrSize) {\n ctx = ctx.parent;\n }\n\n return ctx && typeof ctx.version === 'number' ? ctx.version : -1;\n }\n\n /**\n * @param {DecodeStream} stream\n * @param {StructValue} parent\n * @returns {unknown[]}\n */\n decode(stream, parent) {\n let version = this.getCFFVersion(parent);\n let count = version >= 2\n ? stream.readUInt32BE()\n : stream.readUInt16BE();\n\n if (count === 0) {\n return [];\n }\n\n let offSize = stream.readUInt8();\n /** @type {NumberT} */\n let offsetType;\n if (offSize === 1) {\n offsetType = r.uint8;\n } else if (offSize === 2) {\n offsetType = r.uint16;\n } else if (offSize === 3) {\n offsetType = r.uint24;\n } else if (offSize === 4) {\n offsetType = r.uint32;\n } else {\n throw new Error(`Bad offset size in CFFIndex: ${offSize} ${stream.pos}`);\n }\n\n /** @type {unknown[]} */\n let ret = [];\n let startPos = stream.pos + ((count + 1) * offSize) - 1;\n\n let start = offsetType.decode(stream);\n for (let i = 0; i < count; i++) {\n let end = offsetType.decode(stream);\n\n if (this.type != null && this.type.decode) {\n let pos = stream.pos;\n stream.pos = startPos + start;\n\n parent.length = end - start;\n ret.push(this.type.decode(stream, parent));\n stream.pos = pos;\n } else {\n /** @type {CFFCharString} */\n let range = {\n offset: startPos + start,\n length: end - start\n };\n ret.push(range);\n }\n\n start = end;\n }\n\n stream.pos = startPos + start;\n return ret;\n }\n\n /**\n * @param {unknown[]} arr\n * @param {StructValue | null | undefined} parent\n * @returns {number}\n */\n size(arr, parent) {\n let size = 2;\n if (arr.length === 0) {\n return size;\n }\n\n /** @type {BaseType} */\n let type = this.type || new r.Buffer();\n\n // find maximum offset to detminine offset type\n let offset = 1;\n for (let i = 0; i < arr.length; i++) {\n let item = arr[i];\n if (!type.size) {\n throw new Error('CFFIndex element type must implement size()');\n }\n let itemSize = type.size(item, parent);\n if (typeof itemSize !== 'number') {\n throw new Error('CFFIndex element size() must return a number');\n }\n offset += itemSize;\n }\n\n /** @type {NumberT} */\n let offsetType;\n if (offset <= 0xff) {\n offsetType = r.uint8;\n } else if (offset <= 0xffff) {\n offsetType = r.uint16;\n } else if (offset <= 0xffffff) {\n offsetType = r.uint24;\n } else if (offset <= 0xffffffff) {\n offsetType = r.uint32;\n } else {\n throw new Error('Bad offset in CFFIndex');\n }\n\n size += 1 + offsetType.size() * (arr.length + 1);\n size += offset - 1;\n\n return size;\n }\n\n /**\n * @param {EncodeStream} stream\n * @param {unknown[]} arr\n * @param {StructValue | null | undefined} parent\n * @returns {void}\n */\n encode(stream, arr, parent) {\n stream.writeUInt16BE(arr.length);\n if (arr.length === 0) {\n return;\n }\n\n /** @type {BaseType} */\n let type = this.type || new r.Buffer();\n\n // find maximum offset to detminine offset type\n /** @type {number[]} */\n let sizes = [];\n let offset = 1;\n for (let item of arr) {\n if (!type.size) {\n throw new Error('CFFIndex element type must implement size()');\n }\n let s = type.size(item, parent);\n if (typeof s !== 'number') {\n throw new Error('CFFIndex element size() must return a number');\n }\n sizes.push(s);\n offset += s;\n }\n\n /** @type {NumberT} */\n let offsetType;\n if (offset <= 0xff) {\n offsetType = r.uint8;\n } else if (offset <= 0xffff) {\n offsetType = r.uint16;\n } else if (offset <= 0xffffff) {\n offsetType = r.uint24;\n } else if (offset <= 0xffffffff) {\n offsetType = r.uint32;\n } else {\n throw new Error('Bad offset in CFFIndex');\n }\n\n // write offset size\n stream.writeUInt8(offsetType.size());\n\n // write elements\n offset = 1;\n offsetType.encode(stream, offset);\n\n for (let size of sizes) {\n offset += size;\n offsetType.encode(stream, offset);\n }\n\n for (let item of arr) {\n if (!type.encode) {\n throw new Error('CFFIndex element type must implement encode()');\n }\n // Element type varies (String, Buffer, CFFDict, \u2026); BaseType.encode accepts unknown.\n type.encode(stream, item, parent);\n }\n\n return;\n }\n}\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').BaseType} BaseType */\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').EncodeStream} EncodeStream */\n/** @typedef {import('restructure').PointerOptions} PointerOptions */\n/** @typedef {import('restructure').StructValue} StructValue */\n\n/**\n * CFF dict pointer: offset comes from a prior operand rather than the stream.\n * Temporary offsetType stubs only implement the method needed for that phase.\n */\nexport default class CFFPointer extends r.Pointer {\n /**\n * @param {BaseType | null} type\n * @param {PointerOptions} [options]\n */\n constructor(type, options = {}) {\n if (options.type == null) {\n options.type = 'global';\n }\n\n super(null, type, options);\n }\n\n /**\n * @param {DecodeStream} stream\n * @param {StructValue | null | undefined} parent\n * @param {number[]} operands\n * @returns {unknown}\n */\n decode(stream, parent, operands) {\n this.offsetType = {\n decode: () => operands[0]\n };\n\n return super.decode(stream, parent, operands);\n }\n\n /**\n * @param {EncodeStream | null} stream\n * @param {unknown} value\n * @param {StructValue | null | undefined} ctx\n * @returns {Ptr[]}\n */\n encode(stream, value, ctx) {\n if (!stream) {\n // compute the size (so ctx.pointerSize is correct)\n this.offsetType = {\n size: () => 0\n };\n\n this.size(value, ctx);\n return [new Ptr(0)];\n }\n\n /** @type {number | null} */\n let ptr = null;\n this.offsetType = {\n /**\n * @param {EncodeStream} _stream\n * @param {number} val\n */\n encode: (_stream, val) => { ptr = val; }\n };\n\n super.encode(stream, value, ctx);\n return [new Ptr(ptr ?? 0)];\n }\n}\n\nclass Ptr {\n /**\n * @param {number} val\n */\n constructor(val) {\n /** @type {number} */\n this.val = val;\n /** @type {boolean} */\n this.forceLarge = true;\n }\n\n /**\n * @returns {number}\n */\n valueOf() {\n return this.val;\n }\n}\n", "import CFFDict from './CFFDict';\nimport CFFIndex from './CFFIndex';\nimport CFFPointer from './CFFPointer';\n\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').StructValue} StructValue */\n\n/** @type {import('../../types/fontkit').CFFOperandType} */\nconst CFFBlendOp = {\n /**\n * @param {DecodeStream} _stream\n * @param {StructValue} _parent\n * @param {number[]} operands\n * @returns {void}\n */\n decode(_stream, _parent, operands) {\n let numBlends = operands.pop();\n\n // TODO: actually blend. For now just consume the deltas\n // since we don't use any of the values anyway.\n while (operands.length > /** @type {number} */ (numBlends)) {\n operands.pop();\n }\n }\n};\n\nexport default new CFFDict([\n // key name type default\n [6, 'BlueValues', 'delta', null],\n [7, 'OtherBlues', 'delta', null],\n [8, 'FamilyBlues', 'delta', null],\n [9, 'FamilyOtherBlues', 'delta', null],\n [[12, 9], 'BlueScale', 'number', 0.039625],\n [[12, 10], 'BlueShift', 'number', 7],\n [[12, 11], 'BlueFuzz', 'number', 1],\n [10, 'StdHW', 'number', null],\n [11, 'StdVW', 'number', null],\n [[12, 12], 'StemSnapH', 'delta', null],\n [[12, 13], 'StemSnapV', 'delta', null],\n [[12, 14], 'ForceBold', 'boolean', false],\n [[12, 17], 'LanguageGroup', 'number', 0],\n [[12, 18], 'ExpansionFactor', 'number', 0.06],\n [[12, 19], 'initialRandomSeed', 'number', 0],\n [20, 'defaultWidthX', 'number', 0],\n [21, 'nominalWidthX', 'number', 0],\n [22, 'vsindex', 'number', 0],\n [23, 'blend', CFFBlendOp, null],\n [19, 'Subrs', new CFFPointer(new CFFIndex(), { type: 'local' }), null]\n]);\n", "/** @type {string[]} */\nexport let StandardEncoding = [\n '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright',\n 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two',\n 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater',\n 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',\n 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',\n 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',\n 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', '', '', '', '', '', '',\n '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n 'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle',\n 'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger',\n 'daggerdbl', 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright',\n 'guillemotright', 'ellipsis', 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', 'tilde',\n 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron',\n 'emdash', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', '',\n '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '',\n 'lslash', 'oslash', 'oe', 'germandbls'\n];\n\n/** @type {string[]} */\nexport let ExpertEncoding = [\n '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', 'dollarsuperior',\n 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader',\n 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',\n 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',\n 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', '', 'asuperior',\n 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',\n 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff', 'fi', 'fl', 'ffi', 'ffl',\n 'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall',\n 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall',\n 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',\n 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '',\n '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',\n 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',\n 'Brevesmall', 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', 'figuredash', 'hypheninferior',\n '', '', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',\n 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '',\n '', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',\n 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',\n 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',\n 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',\n 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',\n 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',\n 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall',\n 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',\n 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'\n];\n", "/** @type {string[]} */\nexport let ISOAdobeCharset = [\n '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',\n 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',\n 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',\n 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',\n 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',\n 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\n 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\n 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',\n 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',\n 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',\n 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',\n 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',\n 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',\n 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',\n 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',\n 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',\n 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',\n 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',\n 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',\n 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',\n 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',\n 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',\n 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',\n 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',\n 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',\n 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',\n 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',\n 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',\n 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',\n 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',\n 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',\n 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',\n 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',\n 'ugrave', 'yacute', 'ydieresis', 'zcaron'\n];\n\n/** @type {string[]} */\nexport let ExpertCharset = [\n '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',\n 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',\n 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',\n 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',\n 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',\n 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',\n 'colon', 'semicolon', 'commasuperior', 'threequartersemdash',\n 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',\n 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',\n 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',\n 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',\n 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',\n 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',\n 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',\n 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',\n 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',\n 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',\n 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',\n 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',\n 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',\n 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',\n 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',\n 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',\n 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',\n 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',\n 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',\n 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',\n 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',\n 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',\n 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',\n 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',\n 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',\n 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',\n 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',\n 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',\n 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',\n 'Ydieresissmall'\n];\n\n/** @type {string[]} */\nexport let ExpertSubsetCharset = [\n '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',\n 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',\n 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',\n 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',\n 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',\n 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',\n 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',\n 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',\n 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',\n 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',\n 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',\n 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',\n 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',\n 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',\n 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',\n 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',\n 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',\n 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',\n 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',\n 'periodinferior', 'commainferior'\n];\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').BaseType} BaseType */\n/** @typedef {import('restructure').StructValue} StructValue */\n\n// ########################\n// Scripts and Languages #\n// ########################\n\nlet LangSysTable = new r.Struct({\n reserved: new r.Reserved(r.uint16),\n reqFeatureIndex: r.uint16,\n featureCount: r.uint16,\n featureIndexes: new r.Array(r.uint16, 'featureCount')\n});\n\nlet LangSysRecord = new r.Struct({\n tag: new r.String(4),\n langSys: new r.Pointer(r.uint16, LangSysTable, { type: 'parent' })\n});\n\nlet Script = new r.Struct({\n defaultLangSys: new r.Pointer(r.uint16, LangSysTable),\n count: r.uint16,\n langSysRecords: new r.Array(LangSysRecord, 'count')\n});\n\nlet ScriptRecord = new r.Struct({\n tag: new r.String(4),\n script: new r.Pointer(r.uint16, Script, { type: 'parent' })\n});\n\n/** @type {import('restructure').ArrayT} */\nexport let ScriptList = new r.Array(ScriptRecord, r.uint16);\n\n// #######################\n// Features and Lookups #\n// #######################\n\nlet FeatureParams = new r.Struct({\n version: r.uint16, // should be set to 0 according OT spec\n nameID: r.uint16 // OT spec: UI Name ID or uiLabelNameId\n});\n\n/** @type {import('restructure').Struct} */\nexport let Feature = new r.Struct({\n featureParams: new r.Pointer(r.uint16, FeatureParams),\n lookupCount: r.uint16,\n lookupListIndexes: new r.Array(r.uint16, 'lookupCount')\n});\n\nlet FeatureRecord = new r.Struct({\n tag: new r.String(4),\n feature: new r.Pointer(r.uint16, Feature, { type: 'parent' })\n});\n\n/** @type {import('restructure').ArrayT} */\nexport let FeatureList = new r.Array(FeatureRecord, r.uint16);\n\nlet LookupFlags = new r.Struct({\n markAttachmentType: r.uint8,\n flags: new r.Bitfield(r.uint8, [\n 'rightToLeft', 'ignoreBaseGlyphs', 'ignoreLigatures',\n 'ignoreMarks', 'useMarkFilteringSet'\n ])\n});\n\n/**\n * @param {BaseType} SubTable\n * @returns {import('restructure').LazyArray}\n */\nexport function LookupList(SubTable) {\n let Lookup = new r.Struct({\n lookupType: r.uint16,\n flags: LookupFlags,\n subTableCount: r.uint16,\n subTables: new r.Array(new r.Pointer(r.uint16, SubTable), 'subTableCount'),\n markFilteringSet: new r.Optional(\n r.uint16,\n /** @param {StructValue} t @returns {boolean} */\n (t) => {\n let flags = /** @type {StructValue} */ (t.flags);\n let bits = /** @type {Record<string, boolean>} */ (flags.flags);\n return !!bits.useMarkFilteringSet;\n }\n )\n });\n\n return new r.LazyArray(new r.Pointer(r.uint16, Lookup), r.uint16);\n}\n\n// #################\n// Coverage Table #\n// #################\n\nlet RangeRecord = new r.Struct({\n start: r.uint16,\n end: r.uint16,\n startCoverageIndex: r.uint16\n});\n\n/** @type {import('restructure').VersionedStruct} */\nexport let Coverage = new r.VersionedStruct(r.uint16, {\n 1: {\n glyphCount: r.uint16,\n glyphs: new r.Array(r.uint16, 'glyphCount')\n },\n 2: {\n rangeCount: r.uint16,\n rangeRecords: new r.Array(RangeRecord, 'rangeCount')\n }\n});\n\n// #########################\n// Class Definition Table #\n// #########################\n\nlet ClassRangeRecord = new r.Struct({\n start: r.uint16,\n end: r.uint16,\n class: r.uint16\n});\n\n/** @type {import('restructure').VersionedStruct} */\nexport let ClassDef = new r.VersionedStruct(r.uint16, {\n 1: { // Class array\n startGlyph: r.uint16,\n glyphCount: r.uint16,\n classValueArray: new r.Array(r.uint16, 'glyphCount')\n },\n 2: { // Class ranges\n classRangeCount: r.uint16,\n classRangeRecord: new r.Array(ClassRangeRecord, 'classRangeCount')\n }\n});\n\n// ###############\n// Device Table #\n// ###############\n\n/** @type {import('restructure').Struct} */\nexport let Device = new r.Struct({\n a: r.uint16, // startSize for hinting Device, outerIndex for VariationIndex\n b: r.uint16, // endSize for Device, innerIndex for VariationIndex\n deltaFormat: r.uint16\n});\n\n// #############################################\n// Contextual Substitution/Positioning Tables #\n// #############################################\n\nlet LookupRecord = new r.Struct({\n sequenceIndex: r.uint16,\n lookupListIndex: r.uint16\n});\n\nlet Rule = new r.Struct({\n glyphCount: r.uint16,\n lookupCount: r.uint16,\n input: new r.Array(\n r.uint16,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.glyphCount) - 1\n ),\n lookupRecords: new r.Array(LookupRecord, 'lookupCount')\n});\n\nlet RuleSet = new r.Array(new r.Pointer(r.uint16, Rule), r.uint16);\n\nlet ClassRule = new r.Struct({\n glyphCount: r.uint16,\n lookupCount: r.uint16,\n classes: new r.Array(\n r.uint16,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.glyphCount) - 1\n ),\n lookupRecords: new r.Array(LookupRecord, 'lookupCount')\n});\n\nlet ClassSet = new r.Array(new r.Pointer(r.uint16, ClassRule), r.uint16);\n\n/** @type {import('restructure').VersionedStruct} */\nexport let Context = new r.VersionedStruct(r.uint16, {\n 1: { // Simple context\n coverage: new r.Pointer(r.uint16, Coverage),\n ruleSetCount: r.uint16,\n ruleSets: new r.Array(new r.Pointer(r.uint16, RuleSet), 'ruleSetCount')\n },\n 2: { // Class-based context\n coverage: new r.Pointer(r.uint16, Coverage),\n classDef: new r.Pointer(r.uint16, ClassDef),\n classSetCnt: r.uint16,\n classSet: new r.Array(new r.Pointer(r.uint16, ClassSet), 'classSetCnt')\n },\n 3: {\n glyphCount: r.uint16,\n lookupCount: r.uint16,\n coverages: new r.Array(new r.Pointer(r.uint16, Coverage), 'glyphCount'),\n lookupRecords: new r.Array(LookupRecord, 'lookupCount')\n }\n});\n\n// ######################################################\n// Chaining Contextual Substitution/Positioning Tables #\n// ######################################################\n\nlet ChainRule = new r.Struct({\n backtrackGlyphCount: r.uint16,\n backtrack: new r.Array(r.uint16, 'backtrackGlyphCount'),\n inputGlyphCount: r.uint16,\n input: new r.Array(\n r.uint16,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.inputGlyphCount) - 1\n ),\n lookaheadGlyphCount: r.uint16,\n lookahead: new r.Array(r.uint16, 'lookaheadGlyphCount'),\n lookupCount: r.uint16,\n lookupRecords: new r.Array(LookupRecord, 'lookupCount')\n});\n\nlet ChainRuleSet = new r.Array(new r.Pointer(r.uint16, ChainRule), r.uint16);\n\n/** @type {import('restructure').VersionedStruct} */\nexport let ChainingContext = new r.VersionedStruct(r.uint16, {\n 1: { // Simple context glyph substitution\n coverage: new r.Pointer(r.uint16, Coverage),\n chainCount: r.uint16,\n chainRuleSets: new r.Array(new r.Pointer(r.uint16, ChainRuleSet), 'chainCount')\n },\n\n 2: { // Class-based chaining context\n coverage: new r.Pointer(r.uint16, Coverage),\n backtrackClassDef: new r.Pointer(r.uint16, ClassDef),\n inputClassDef: new r.Pointer(r.uint16, ClassDef),\n lookaheadClassDef: new r.Pointer(r.uint16, ClassDef),\n chainCount: r.uint16,\n chainClassSet: new r.Array(new r.Pointer(r.uint16, ChainRuleSet), 'chainCount')\n },\n\n 3: { // Coverage-based chaining context\n backtrackGlyphCount: r.uint16,\n backtrackCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'backtrackGlyphCount'),\n inputGlyphCount: r.uint16,\n inputCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'inputGlyphCount'),\n lookaheadGlyphCount: r.uint16,\n lookaheadCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'lookaheadGlyphCount'),\n lookupCount: r.uint16,\n lookupRecords: new r.Array(LookupRecord, 'lookupCount')\n }\n});\n", "import { Feature } from './opentype';\nimport * as r from 'restructure';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\n/** *****************\n * Variation Store *\n *******************/\n\nlet F2DOT14 = new r.Fixed(16, 'BE', 14);\nlet RegionAxisCoordinates = new r.Struct({\n startCoord: F2DOT14,\n peakCoord: F2DOT14,\n endCoord: F2DOT14\n});\n\nlet VariationRegionList = new r.Struct({\n axisCount: r.uint16,\n regionCount: r.uint16,\n variationRegions: new r.Array(new r.Array(RegionAxisCoordinates, 'axisCount'), 'regionCount')\n});\n\nlet DeltaSet = new r.Struct({\n shortDeltas: new r.Array(\n r.int16,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (/** @type {StructValue} */ (t.parent).shortDeltaCount)\n ),\n regionDeltas: new r.Array(\n r.int8,\n /** @param {StructValue} t @returns {number} */\n (t) => {\n let parent = /** @type {StructValue} */ (t.parent);\n return /** @type {number} */ (parent.regionIndexCount)\n - /** @type {number} */ (parent.shortDeltaCount);\n }\n ),\n /**\n * @param {StructValue} t\n * @returns {number[]}\n */\n deltas: t => /** @type {number[]} */ (t.shortDeltas).concat(/** @type {number[]} */ (t.regionDeltas))\n});\n\nlet ItemVariationData = new r.Struct({\n itemCount: r.uint16,\n shortDeltaCount: r.uint16,\n regionIndexCount: r.uint16,\n regionIndexes: new r.Array(r.uint16, 'regionIndexCount'),\n deltaSets: new r.Array(DeltaSet, 'itemCount')\n});\n\n/** @type {import('restructure').Struct} */\nexport let ItemVariationStore = new r.Struct({\n format: r.uint16,\n variationRegionList: new r.Pointer(r.uint32, VariationRegionList),\n variationDataCount: r.uint16,\n itemVariationData: new r.Array(new r.Pointer(r.uint32, ItemVariationData), 'variationDataCount')\n});\n\n/** ********************\n * Feature Variations *\n **********************/\n\nlet ConditionTable = new r.VersionedStruct(r.uint16, {\n 1: {\n axisIndex: r.uint16,\n filterRangeMinValue: F2DOT14,\n filterRangeMaxValue: F2DOT14\n }\n});\n\nlet ConditionSet = new r.Struct({\n conditionCount: r.uint16,\n conditionTable: new r.Array(new r.Pointer(r.uint32, ConditionTable), 'conditionCount')\n});\n\nlet FeatureTableSubstitutionRecord = new r.Struct({\n featureIndex: r.uint16,\n alternateFeatureTable: new r.Pointer(r.uint32, Feature, { type: 'parent' })\n});\n\nlet FeatureTableSubstitution = new r.Struct({\n version: r.fixed32,\n substitutionCount: r.uint16,\n substitutions: new r.Array(FeatureTableSubstitutionRecord, 'substitutionCount')\n});\n\nlet FeatureVariationRecord = new r.Struct({\n conditionSet: new r.Pointer(r.uint32, ConditionSet, { type: 'parent' }),\n featureTableSubstitution: new r.Pointer(r.uint32, FeatureTableSubstitution, { type: 'parent' })\n});\n\n/** @type {import('restructure').Struct} */\nexport let FeatureVariations = new r.Struct({\n majorVersion: r.uint16,\n minorVersion: r.uint16,\n featureVariationRecordCount: r.uint32,\n featureVariationRecords: new r.Array(FeatureVariationRecord, 'featureVariationRecordCount')\n});\n", "import * as r from 'restructure';\nimport { resolveLength } from 'restructure';\nimport CFFDict from './CFFDict';\nimport CFFIndex from './CFFIndex';\nimport CFFPointer from './CFFPointer';\nimport CFFPrivateDict from './CFFPrivateDict';\nimport { StandardEncoding, ExpertEncoding } from './CFFEncodings';\nimport { ISOAdobeCharset, ExpertCharset, ExpertSubsetCharset } from './CFFCharsets';\nimport { ItemVariationStore } from '../tables/variations';\n\n/** @typedef {import('restructure').BaseType} BaseType */\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').EncodeStream} EncodeStream */\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('../../types/fontkit').CFFEncodeContext} CFFEncodeContext */\n\n/**\n * @param {StructValue} t\n * @returns {number}\n */\nfunction charStringsCount(t) {\n let parent = t.parent;\n if (!parent) {\n return 0;\n }\n let cs = parent.CharStrings;\n if (cs && typeof cs === 'object' && 'length' in cs && typeof /** @type {{ length: unknown }} */ (cs).length === 'number') {\n return /** @type {{ length: number }} */ (cs).length;\n }\n return 0;\n}\n\n// Checks if an operand is an index of a predefined value,\n// otherwise delegates to the provided type.\nclass PredefinedOp {\n /**\n * @param {unknown[]} predefinedOps\n * @param {BaseType} type\n */\n constructor(predefinedOps, type) {\n /** @type {unknown[]} */\n this.predefinedOps = predefinedOps;\n /** @type {BaseType} */\n this.type = type;\n }\n\n /**\n * @param {DecodeStream} stream\n * @param {StructValue} parent\n * @param {number[]} operands\n * @returns {unknown}\n */\n decode(stream, parent, operands) {\n if (this.predefinedOps[operands[0]] != null) {\n return this.predefinedOps[operands[0]];\n }\n\n if (!this.type.decode) {\n throw new Error('PredefinedOp type must implement decode()');\n }\n return this.type.decode(stream, parent, operands);\n }\n\n /**\n * @param {unknown} value\n * @param {StructValue | null | undefined} ctx\n * @returns {unknown}\n */\n size(value, ctx) {\n if (!this.type.size) {\n throw new Error('PredefinedOp type must implement size()');\n }\n return this.type.size(value, ctx);\n }\n\n /**\n * @param {EncodeStream | null} stream\n * @param {unknown} value\n * @param {StructValue | null | undefined} ctx\n * @returns {unknown[]}\n */\n encode(stream, value, ctx) {\n let index = this.predefinedOps.indexOf(value);\n if (index !== -1) {\n // Must be an operand list \u2014 CFFDict iterates with for-of.\n return [index];\n }\n\n if (!this.type.encode) {\n throw new Error('PredefinedOp type must implement encode()');\n }\n let encoded = this.type.encode(stream, value, ctx);\n return Array.isArray(encoded) ? encoded : [encoded];\n }\n}\n\nclass CFFEncodingVersion extends r.Number {\n constructor() {\n super('UInt8');\n }\n\n /**\n * @param {DecodeStream} stream\n * @returns {number}\n */\n decode(stream) {\n return r.uint8.decode(stream) & 0x7f;\n }\n}\n\nlet Range1 = new r.Struct({\n first: r.uint16,\n nLeft: r.uint8\n});\n\nlet Range2 = new r.Struct({\n first: r.uint16,\n nLeft: r.uint16\n});\n\nlet CFFCustomEncoding = new r.VersionedStruct(new CFFEncodingVersion(), {\n 0: {\n nCodes: r.uint8,\n codes: new r.Array(r.uint8, 'nCodes')\n },\n\n 1: {\n nRanges: r.uint8,\n ranges: new r.Array(Range1, 'nRanges')\n }\n\n // TODO: supplement?\n});\n\nlet CFFEncoding = new PredefinedOp([StandardEncoding, ExpertEncoding], new CFFPointer(CFFCustomEncoding, { lazy: true }));\n\n// Decodes an array of ranges until the total\n// length is equal to the provided length.\nclass RangeArray extends r.Array {\n /**\n * @param {DecodeStream} stream\n * @param {StructValue} parent\n * @returns {Array<StructValue & { nLeft: number, offset: number }>}\n */\n decode(stream, parent) {\n if (this.length == null) {\n throw new Error('RangeArray requires a length');\n }\n let length = resolveLength(this.length, stream, parent);\n let count = 0;\n /** @type {Array<StructValue & { nLeft: number, offset: number }>} */\n let res = [];\n while (count < length) {\n if (!this.type.decode) {\n throw new Error('RangeArray element type must implement decode()');\n }\n let range = /** @type {StructValue & { nLeft: number, offset?: number }} */ (\n this.type.decode(stream, parent)\n );\n range.offset = count;\n count += range.nLeft + 1;\n res.push(/** @type {StructValue & { nLeft: number, offset: number }} */ (range));\n }\n\n return res;\n }\n}\n\nlet CFFCustomCharset = new r.VersionedStruct(r.uint8, {\n 0: {\n glyphs: new r.Array(r.uint16, t => charStringsCount(t) - 1)\n },\n\n 1: {\n ranges: new RangeArray(Range1, t => charStringsCount(t) - 1)\n },\n\n 2: {\n ranges: new RangeArray(Range2, t => charStringsCount(t) - 1)\n }\n});\n\nlet CFFCharset = new PredefinedOp([ISOAdobeCharset, ExpertCharset, ExpertSubsetCharset], new CFFPointer(CFFCustomCharset, { lazy: true }));\n\nlet FDRange3 = new r.Struct({\n first: r.uint16,\n fd: r.uint8\n});\n\nlet FDRange4 = new r.Struct({\n first: r.uint32,\n fd: r.uint16\n});\n\nlet FDSelect = new r.VersionedStruct(r.uint8, {\n 0: {\n fds: new r.Array(r.uint8, t => charStringsCount(t))\n },\n\n 3: {\n nRanges: r.uint16,\n ranges: new r.Array(FDRange3, 'nRanges'),\n sentinel: r.uint16\n },\n\n 4: {\n nRanges: r.uint32,\n ranges: new r.Array(FDRange4, 'nRanges'),\n sentinel: r.uint32\n }\n});\n\nlet ptr = new CFFPointer(CFFPrivateDict);\nclass CFFPrivateOp {\n /**\n * @param {DecodeStream} stream\n * @param {StructValue} parent\n * @param {number[]} operands\n * @returns {unknown}\n */\n decode(stream, parent, operands) {\n parent.length = operands[0];\n return ptr.decode(stream, parent, [operands[1]]);\n }\n\n /**\n * Size operands match encode(null, \u2026): [privateDictByteLength, pointerOperand].\n * @param {StructValue} dict\n * @param {CFFEncodeContext | StructValue} ctx\n * @returns {unknown[]}\n */\n size(dict, ctx) {\n // Delegate to encode(null) so pointerSize is updated and operands match.\n return this.encode(null, dict, ctx);\n }\n\n /**\n * @param {EncodeStream | null} stream\n * @param {StructValue} dict\n * @param {CFFEncodeContext | StructValue} ctx\n * @returns {unknown[]}\n */\n encode(stream, dict, ctx) {\n return [CFFPrivateDict.size(dict, ctx, false), ptr.encode(stream, dict, ctx)[0]];\n }\n}\n\nlet FontDict = new CFFDict([\n // key name type(s) default\n [18, 'Private', new CFFPrivateOp(), null],\n [[12, 38], 'FontName', 'sid', null],\n [[12, 7], 'FontMatrix', 'array', [0.001, 0, 0, 0.001, 0, 0]],\n [[12, 5], 'PaintType', 'number', 0]\n]);\n\nlet CFFTopDict = new CFFDict([\n // key name type(s) default\n [[12, 30], 'ROS', ['sid', 'sid', 'number'], null],\n\n [0, 'version', 'sid', null],\n [1, 'Notice', 'sid', null],\n [[12, 0], 'Copyright', 'sid', null],\n [2, 'FullName', 'sid', null],\n [3, 'FamilyName', 'sid', null],\n [4, 'Weight', 'sid', null],\n [[12, 1], 'isFixedPitch', 'boolean', false],\n [[12, 2], 'ItalicAngle', 'number', 0],\n [[12, 3], 'UnderlinePosition', 'number', -100],\n [[12, 4], 'UnderlineThickness', 'number', 50],\n [[12, 5], 'PaintType', 'number', 0],\n [[12, 6], 'CharstringType', 'number', 2],\n [[12, 7], 'FontMatrix', 'array', [0.001, 0, 0, 0.001, 0, 0]],\n [13, 'UniqueID', 'number', null],\n [5, 'FontBBox', 'array', [0, 0, 0, 0]],\n [[12, 8], 'StrokeWidth', 'number', 0],\n [14, 'XUID', 'array', null],\n [15, 'charset', CFFCharset, ISOAdobeCharset],\n [16, 'Encoding', CFFEncoding, StandardEncoding],\n [17, 'CharStrings', new CFFPointer(new CFFIndex()), null],\n [18, 'Private', new CFFPrivateOp(), null],\n [[12, 20], 'SyntheticBase', 'number', null],\n [[12, 21], 'PostScript', 'sid', null],\n [[12, 22], 'BaseFontName', 'sid', null],\n [[12, 23], 'BaseFontBlend', 'delta', null],\n\n // CID font specific\n [[12, 31], 'CIDFontVersion', 'number', 0],\n [[12, 32], 'CIDFontRevision', 'number', 0],\n [[12, 33], 'CIDFontType', 'number', 0],\n [[12, 34], 'CIDCount', 'number', 8720],\n [[12, 35], 'UIDBase', 'number', null],\n [[12, 37], 'FDSelect', new CFFPointer(FDSelect), null],\n [[12, 36], 'FDArray', new CFFPointer(new CFFIndex(FontDict)), null],\n [[12, 38], 'FontName', 'sid', null]\n]);\n\nlet VariationStore = new r.Struct({\n length: r.uint16,\n itemVariationStore: ItemVariationStore\n});\n\nlet CFF2TopDict = new CFFDict([\n [[12, 7], 'FontMatrix', 'array', [0.001, 0, 0, 0.001, 0, 0]],\n [17, 'CharStrings', new CFFPointer(new CFFIndex()), null],\n [[12, 37], 'FDSelect', new CFFPointer(FDSelect), null],\n [[12, 36], 'FDArray', new CFFPointer(new CFFIndex(FontDict)), null],\n [24, 'vstore', new CFFPointer(VariationStore), null],\n [25, 'maxstack', 'number', 193]\n]);\n\nlet CFFTop = new r.VersionedStruct(r.fixed16, {\n 1: {\n hdrSize: r.uint8,\n offSize: r.uint8,\n nameIndex: new CFFIndex(new r.String('length')),\n topDictIndex: new CFFIndex(CFFTopDict),\n stringIndex: new CFFIndex(new r.String('length')),\n globalSubrIndex: new CFFIndex()\n },\n\n 2: {\n hdrSize: r.uint8,\n length: r.uint16,\n topDict: CFF2TopDict,\n globalSubrIndex: new CFFIndex()\n }\n});\n\nexport default CFFTop;\n", "// Automatically generated from Appendix A of the CFF specification; do\n// not edit. Length should be 391.\n/** @type {string[]} */\nexport default [\n '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',\n 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',\n 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one',\n 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon',\n 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C',\n 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',\n 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash',\n 'bracketright', 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c',\n 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',\n 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',\n 'asciitilde', 'exclamdown', 'cent', 'sterling', 'fraction', 'yen',\n 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft',\n 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash',\n 'dagger', 'daggerdbl', 'periodcentered', 'paragraph', 'bullet',\n 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright',\n 'ellipsis', 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex',\n 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',\n 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash',\n 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe',\n 'germandbls', 'onesuperior', 'logicalnot', 'mu', 'trademark', 'Eth',\n 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar',\n 'degree', 'thorn', 'threequarters', 'twosuperior', 'registered', 'minus',\n 'eth', 'multiply', 'threesuperior', 'copyright', 'Aacute', 'Acircumflex',\n 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute',\n 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis',\n 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 'Odieresis', 'Ograve',\n 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave',\n 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis',\n 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute', 'ecircumflex',\n 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave',\n 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 'ograve', 'otilde',\n 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave', 'yacute',\n 'ydieresis', 'zcaron', 'exclamsmall', 'Hungarumlautsmall',\n 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',\n 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',\n 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',\n 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',\n 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',\n 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',\n 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',\n 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior',\n 'ssuperior', 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior',\n 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',\n 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',\n 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',\n 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',\n 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',\n 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',\n 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',\n 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 'figuredash',\n 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall',\n 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',\n 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'foursuperior',\n 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',\n 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',\n 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',\n 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',\n 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',\n 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',\n 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',\n 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',\n 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',\n 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',\n 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',\n 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',\n 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003', 'Black',\n 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'\n];\n", "import CFFTop from './CFFTop';\nimport standardStrings from './CFFStandardStrings';\n\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').BinaryBuffer} BinaryBuffer */\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('../../types/fontkit').CFFTopDict} CFFTopDict */\n/** @typedef {import('../../types/fontkit').CFFPrivateDict} CFFPrivateDict */\n/** @typedef {import('../../types/fontkit').CFFCharString} CFFCharString */\n\n/**\n * Decoded CFF / CFF2 font table.\n * Properties from CFFTop are copied onto the instance in decode().\n */\nclass CFFFont {\n /**\n * @param {DecodeStream} stream\n */\n constructor(stream) {\n /** @type {DecodeStream} */\n this.stream = stream;\n /** @type {number} */\n this.version = 0;\n /** @type {number | undefined} */\n this.hdrSize = undefined;\n /** @type {CFFTopDict} */\n this.topDict = /** @type {CFFTopDict} */ ({ CharStrings: [] });\n /** @type {StructValue[] | undefined} */\n this.topDictIndex = undefined;\n /** @type {string[] | undefined} */\n this.nameIndex = undefined;\n /** @type {string[] | undefined} */\n this.stringIndex = undefined;\n /** @type {CFFCharString[] | undefined} */\n this.globalSubrIndex = undefined;\n /** @type {boolean} */\n this.isCIDFont = false;\n this.decode();\n }\n\n /**\n * @param {DecodeStream} stream\n * @returns {CFFFont}\n */\n static decode(stream) {\n return new CFFFont(stream);\n }\n\n /**\n * @returns {this}\n */\n decode() {\n let top = CFFTop.decode(this.stream);\n for (let key in top) {\n /** @type {Record<string, unknown>} */ (/** @type {unknown} */ (this))[key] = top[key];\n }\n\n if (this.version < 2) {\n if (!this.topDictIndex || this.topDictIndex.length !== 1) {\n throw new Error('Only a single font is allowed in CFF');\n }\n\n this.topDict = /** @type {CFFTopDict} */ (this.topDictIndex[0]);\n }\n\n this.isCIDFont = this.topDict.ROS != null;\n return this;\n }\n\n /**\n * @param {number | null | undefined} sid\n * @returns {string | null}\n */\n string(sid) {\n if (this.version >= 2) {\n return null;\n }\n\n if (sid == null) {\n return null;\n }\n\n if (sid < standardStrings.length) {\n return standardStrings[sid];\n }\n\n return this.stringIndex ? this.stringIndex[sid - standardStrings.length] : null;\n }\n\n /**\n * @returns {string | null}\n */\n get postscriptName() {\n if (this.version < 2) {\n return this.nameIndex ? this.nameIndex[0] : null;\n }\n\n return null;\n }\n\n /**\n * @returns {string | null}\n */\n get fullName() {\n return this.string(this.topDict.FullName);\n }\n\n /**\n * @returns {string | null}\n */\n get familyName() {\n return this.string(this.topDict.FamilyName);\n }\n\n /**\n * @param {number} glyph\n * @returns {BinaryBuffer}\n */\n getCharString(glyph) {\n let cs = /** @type {CFFCharString} */ (this.topDict.CharStrings[glyph]);\n this.stream.pos = cs.offset;\n return this.stream.readBuffer(cs.length);\n }\n\n /**\n * @param {number} gid\n * @returns {string | null}\n */\n getGlyphName(gid) {\n // CFF2 glyph names are in the post table.\n if (this.version >= 2) {\n return null;\n }\n\n // CID-keyed fonts don't have glyph names\n if (this.isCIDFont) {\n return null;\n }\n\n let { charset } = this.topDict;\n if (Array.isArray(charset)) {\n return /** @type {string} */ (charset[gid]);\n }\n\n if (gid === 0) {\n return '.notdef';\n }\n\n gid -= 1;\n\n if (!charset || typeof charset !== 'object') {\n return null;\n }\n\n /**\n * @typedef {{\n * version?: number,\n * glyphs?: number[],\n * ranges?: Array<{ offset: number, nLeft: number, first: number }>\n * }} CharsetTable\n */\n let cs = /** @type {StructValue & CharsetTable} */ (charset);\n\n switch (cs.version) {\n case 0:\n return this.string(cs.glyphs ? cs.glyphs[gid] : undefined);\n\n case 1:\n case 2:\n if (!cs.ranges) {\n return null;\n }\n for (let i = 0; i < cs.ranges.length; i++) {\n let range = cs.ranges[i];\n if (range.offset <= gid && gid <= range.offset + range.nLeft) {\n return this.string(range.first + (gid - range.offset));\n }\n }\n break;\n }\n\n return null;\n }\n\n /**\n * @param {number} gid\n * @returns {number | null}\n */\n fdForGlyph(gid) {\n if (!this.topDict.FDSelect) {\n return null;\n }\n\n let fdSelect = this.topDict.FDSelect;\n\n switch (fdSelect.version) {\n case 0:\n return fdSelect.fds ? fdSelect.fds[gid] : null;\n\n case 3:\n case 4: {\n let { ranges } = fdSelect;\n if (!ranges) {\n return null;\n }\n let low = 0;\n let high = ranges.length - 1;\n\n while (low <= high) {\n let mid = (low + high) >> 1;\n let midRange = ranges[mid];\n let nextRange = ranges[mid + 1];\n\n if (gid < midRange.first) {\n high = mid - 1;\n } else if (mid < high && nextRange && gid >= nextRange.first) {\n low = mid + 1;\n } else {\n return midRange.fd;\n }\n }\n\n throw new Error(`Unknown FDSelect version: ${fdSelect.version}`);\n }\n default:\n throw new Error(`Unknown FDSelect version: ${fdSelect.version}`);\n }\n }\n\n /**\n * @param {number} gid\n * @returns {CFFPrivateDict | null | undefined}\n */\n privateDictForGlyph(gid) {\n if (this.topDict.FDSelect) {\n let fd = this.fdForGlyph(gid);\n if (fd != null && this.topDict.FDArray && this.topDict.FDArray[fd]) {\n return this.topDict.FDArray[fd].Private;\n }\n\n return null;\n }\n\n if (this.version < 2) {\n return this.topDict.Private;\n }\n\n return this.topDict.FDArray && this.topDict.FDArray[0]\n ? this.topDict.FDArray[0].Private\n : null;\n }\n}\n\nexport default CFFFont;\n", "import * as r from 'restructure';\n\nlet VerticalOrigin = new r.Struct({\n glyphIndex: r.uint16,\n vertOriginY: r.int16\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n majorVersion: r.uint16,\n minorVersion: r.uint16,\n defaultVertOriginY: r.int16,\n numVertOriginYMetrics: r.uint16,\n metrics: new r.Array(VerticalOrigin, 'numVertOriginYMetrics')\n});\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').BaseType} BaseType */\n\n/** @type {import('restructure').Struct} */\nexport let BigMetrics = new r.Struct({\n height: r.uint8,\n width: r.uint8,\n horiBearingX: r.int8,\n horiBearingY: r.int8,\n horiAdvance: r.uint8,\n vertBearingX: r.int8,\n vertBearingY: r.int8,\n vertAdvance: r.uint8\n});\n\n/** @type {import('restructure').Struct} */\nexport let SmallMetrics = new r.Struct({\n height: r.uint8,\n width: r.uint8,\n bearingX: r.int8,\n bearingY: r.int8,\n advance: r.uint8\n});\n\nlet EBDTComponent = new r.Struct({\n glyph: r.uint16,\n xOffset: r.int8,\n yOffset: r.int8\n});\n\n/** Marker codecs for bitmap payload layout (decoded by glyph consumers). */\n/** @type {BaseType} */\nconst ByteAligned = {};\n/** @type {BaseType} */\nconst BitAligned = {};\n\n/** @type {import('restructure').VersionedStruct} */\nexport let glyph = new r.VersionedStruct('version', {\n 1: {\n metrics: SmallMetrics,\n data: ByteAligned\n },\n\n 2: {\n metrics: SmallMetrics,\n data: BitAligned\n },\n\n // format 3 is deprecated\n // format 4 is not supported by Microsoft\n\n 5: {\n data: BitAligned\n },\n\n 6: {\n metrics: BigMetrics,\n data: ByteAligned\n },\n\n 7: {\n metrics: BigMetrics,\n data: BitAligned\n },\n\n 8: {\n metrics: SmallMetrics,\n pad: new r.Reserved(r.uint8),\n numComponents: r.uint16,\n components: new r.Array(EBDTComponent, 'numComponents')\n },\n\n 9: {\n metrics: BigMetrics,\n pad: new r.Reserved(r.uint8),\n numComponents: r.uint16,\n components: new r.Array(EBDTComponent, 'numComponents')\n },\n\n 17: {\n metrics: SmallMetrics,\n dataLen: r.uint32,\n data: new r.Buffer('dataLen')\n },\n\n 18: {\n metrics: BigMetrics,\n dataLen: r.uint32,\n data: new r.Buffer('dataLen')\n },\n\n 19: {\n dataLen: r.uint32,\n data: new r.Buffer('dataLen')\n }\n});\n", "import * as r from 'restructure';\nimport { BigMetrics } from './EBDT';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\nlet SBitLineMetrics = new r.Struct({\n ascender: r.int8,\n descender: r.int8,\n widthMax: r.uint8,\n caretSlopeNumerator: r.int8,\n caretSlopeDenominator: r.int8,\n caretOffset: r.int8,\n minOriginSB: r.int8,\n minAdvanceSB: r.int8,\n maxBeforeBL: r.int8,\n minAfterBL: r.int8,\n pad: new r.Reserved(r.int8, 2)\n});\n\nlet CodeOffsetPair = new r.Struct({\n glyphCode: r.uint16,\n offset: r.uint16\n});\n\n/**\n * Spec: numOffsets = lastGlyphIndex - firstGlyphIndex + 2 (extra sentinel for last glyph size).\n * @param {StructValue} t\n * @returns {number}\n */\nfunction glyphRangeOffsetCount(t) {\n let parent = /** @type {StructValue} */ (t.parent);\n return /** @type {number} */ (parent.lastGlyphIndex)\n - /** @type {number} */ (parent.firstGlyphIndex) + 2;\n}\n\nlet IndexSubtable = new r.VersionedStruct(r.uint16, {\n header: {\n imageFormat: r.uint16,\n imageDataOffset: r.uint32\n },\n\n 1: {\n offsetArray: new r.Array(r.uint32, glyphRangeOffsetCount)\n },\n\n 2: {\n imageSize: r.uint32,\n bigMetrics: BigMetrics\n },\n\n 3: {\n offsetArray: new r.Array(r.uint16, glyphRangeOffsetCount),\n // Format 3 pads to 32-bit alignment when the offset count is odd.\n pad: new r.Reserved(\n r.uint16,\n /** @param {StructValue} t @returns {number} */\n t => glyphRangeOffsetCount(t) % 2\n )\n },\n\n 4: {\n numGlyphs: r.uint32,\n glyphArray: new r.Array(\n CodeOffsetPair,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.numGlyphs) + 1\n )\n },\n\n 5: {\n imageSize: r.uint32,\n bigMetrics: BigMetrics,\n numGlyphs: r.uint32,\n glyphCodeArray: new r.Array(r.uint16, 'numGlyphs'),\n // Format 5 pads to 32-bit alignment when glyphCodeArray length is odd.\n pad: new r.Reserved(\n r.uint16,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.numGlyphs) % 2\n )\n }\n});\n\nlet IndexSubtableRecord = new r.Struct({\n firstGlyphIndex: r.uint16,\n lastGlyphIndex: r.uint16,\n // Offset from the start of IndexSubTableList (OpenType IndexSubTableArray).\n subtable: new r.Pointer(r.uint32, IndexSubtable, { type: 'parent' })\n});\n\n/**\n * Wrapper so record pointers resolve relative to the list start.\n * process() on BitmapSizeTable unwraps `.tables` so the public shape stays an array.\n */\nlet IndexSubTableList = new r.Struct({\n tables: new r.Array(\n IndexSubtableRecord,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (/** @type {StructValue} */ (t.parent).numberOfIndexSubTables)\n )\n});\n\n/**\n * @typedef {StructValue & {\n * indexSubTableArray: { tables: StructValue[] } | StructValue[],\n * numberOfIndexSubTables: number\n * }} BitmapSizeTableValue\n */\n\nlet BitmapSizeTable = new r.Struct({\n // Lazy: numberOfIndexSubTables is stored after this pointer in the binary layout.\n indexSubTableArray: new r.Pointer(r.uint32, IndexSubTableList, { type: 'parent', lazy: true }),\n indexTablesSize: r.uint32,\n numberOfIndexSubTables: r.uint32,\n colorRef: r.uint32,\n hori: SBitLineMetrics,\n vert: SBitLineMetrics,\n startGlyphIndex: r.uint16,\n endGlyphIndex: r.uint16,\n ppemX: r.uint8,\n ppemY: r.uint8,\n bitDepth: r.uint8,\n flags: new r.Bitfield(r.uint8, ['horizontal', 'vertical'])\n});\n\nBitmapSizeTable.process = function () {\n let self = /** @type {BitmapSizeTableValue} */ (this);\n // Access forces lazy decode now that numberOfIndexSubTables is available.\n let list = self.indexSubTableArray;\n if (list && !Array.isArray(list) && Array.isArray(list.tables)) {\n self.indexSubTableArray = list.tables;\n }\n};\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.uint32, // 0x00020000\n numSizes: r.uint32,\n sizes: new r.Array(BitmapSizeTable, 'numSizes')\n});\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\nlet ImageTable = new r.Struct({\n ppem: r.uint16,\n resolution: r.uint16,\n imageOffsets: new r.Array(\n new r.Pointer(r.uint32, 'void'),\n /** @param {StructValue} t @returns {number} */\n (t) => {\n let parent = /** @type {StructValue} */ (t.parent);\n let grand = /** @type {StructValue} */ (parent.parent);\n return /** @type {number} */ (/** @type {StructValue} */ (grand.maxp).numGlyphs) + 1;\n }\n )\n});\n\n// This is the Apple sbix table, used by the \"Apple Color Emoji\" font.\n// It includes several image tables with images for each bitmap glyph\n// of several different sizes.\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.uint16,\n flags: new r.Bitfield(r.uint16, ['renderOutlines']),\n numImgTables: r.uint32,\n imageTables: new r.Array(new r.Pointer(r.uint32, ImageTable), 'numImgTables')\n});\n", "import * as r from 'restructure';\n\nlet LayerRecord = new r.Struct({\n gid: r.uint16, // Glyph ID of layer glyph (must be in z-order from bottom to top).\n paletteIndex: r.uint16 // Index value to use in the appropriate palette. This value must\n}); // be less than numPaletteEntries in the CPAL table, except for\n// the special case noted below. Each palette entry is 16 bits.\n// A palette index of 0xFFFF is a special case indicating that\n// the text foreground color should be used.\n\nlet BaseGlyphRecord = new r.Struct({\n gid: r.uint16, // Glyph ID of reference glyph. This glyph is for reference only\n // and is not rendered for color.\n firstLayerIndex: r.uint16, // Index (from beginning of the Layer Records) to the layer record.\n // There will be numLayers consecutive entries for this base glyph.\n numLayers: r.uint16\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.uint16,\n numBaseGlyphRecords: r.uint16,\n baseGlyphRecord: new r.Pointer(r.uint32, new r.Array(BaseGlyphRecord, 'numBaseGlyphRecords')),\n layerRecords: new r.Pointer(r.uint32, new r.Array(LayerRecord, 'numLayerRecords'), { lazy: true }),\n numLayerRecords: r.uint16\n});\n", "import * as r from 'restructure';\n\nlet ColorRecord = new r.Struct({\n blue: r.uint8,\n green: r.uint8,\n red: r.uint8,\n alpha: r.uint8\n});\n\n/** @type {import('restructure').VersionedStruct} */\nexport default new r.VersionedStruct(r.uint16, {\n header: {\n numPaletteEntries: r.uint16,\n numPalettes: r.uint16,\n numColorRecords: r.uint16,\n colorRecords: new r.Pointer(r.uint32, new r.Array(ColorRecord, 'numColorRecords')),\n colorRecordIndices: new r.Array(r.uint16, 'numPalettes')\n },\n 0: {},\n 1: {\n offsetPaletteTypeArray: new r.Pointer(r.uint32, new r.Array(r.uint32, 'numPalettes')),\n offsetPaletteLabelArray: new r.Pointer(r.uint32, new r.Array(r.uint16, 'numPalettes')),\n offsetPaletteEntryLabelArray: new r.Pointer(r.uint32, new r.Array(r.uint16, 'numPaletteEntries'))\n }\n});\n", "import * as r from 'restructure';\nimport { Device } from './opentype';\nimport { ItemVariationStore } from './variations';\n\nlet BaseCoord = new r.VersionedStruct(r.uint16, {\n 1: { // Design units only\n coordinate: r.int16 // X or Y value, in design units\n },\n\n 2: { // Design units plus contour point\n coordinate: r.int16, // X or Y value, in design units\n referenceGlyph: r.uint16, // GlyphID of control glyph\n baseCoordPoint: r.uint16 // Index of contour point on the referenceGlyph\n },\n\n 3: { // Design units plus Device table\n coordinate: r.int16, // X or Y value, in design units\n deviceTable: new r.Pointer(r.uint16, Device) // Device table for X or Y value\n }\n});\n\nlet BaseValues = new r.Struct({\n defaultIndex: r.uint16, // Index of default baseline for this script-same index in the BaseTagList\n baseCoordCount: r.uint16,\n baseCoords: new r.Array(new r.Pointer(r.uint16, BaseCoord), 'baseCoordCount')\n});\n\nlet FeatMinMaxRecord = new r.Struct({\n tag: new r.String(4), // 4-byte feature identification tag-must match FeatureTag in FeatureList\n minCoord: new r.Pointer(r.uint16, BaseCoord, { type: 'parent' }), // May be NULL\n maxCoord: new r.Pointer(r.uint16, BaseCoord, { type: 'parent' }) // May be NULL\n});\n\nlet MinMax = new r.Struct({\n minCoord: new r.Pointer(r.uint16, BaseCoord), // May be NULL\n maxCoord: new r.Pointer(r.uint16, BaseCoord), // May be NULL\n featMinMaxCount: r.uint16, // May be 0\n featMinMaxRecords: new r.Array(FeatMinMaxRecord, 'featMinMaxCount') // In alphabetical order\n});\n\nlet BaseLangSysRecord = new r.Struct({\n tag: new r.String(4), // 4-byte language system identification tag\n minMax: new r.Pointer(r.uint16, MinMax, { type: 'parent' })\n});\n\nlet BaseScript = new r.Struct({\n baseValues: new r.Pointer(r.uint16, BaseValues), // May be NULL\n defaultMinMax: new r.Pointer(r.uint16, MinMax), // May be NULL\n baseLangSysCount: r.uint16, // May be 0\n baseLangSysRecords: new r.Array(BaseLangSysRecord, 'baseLangSysCount') // in alphabetical order by BaseLangSysTag\n});\n\nlet BaseScriptRecord = new r.Struct({\n tag: new r.String(4), // 4-byte script identification tag\n script: new r.Pointer(r.uint16, BaseScript, { type: 'parent' })\n});\n\nlet BaseScriptList = new r.Array(BaseScriptRecord, r.uint16);\n\n// Array of 4-byte baseline identification tags-must be in alphabetical order\nlet BaseTagList = new r.Array(new r.String(4), r.uint16);\n\nlet Axis = new r.Struct({\n baseTagList: new r.Pointer(r.uint16, BaseTagList), // May be NULL\n baseScriptList: new r.Pointer(r.uint16, BaseScriptList)\n});\n\n/** @type {import('restructure').VersionedStruct} */\nexport default new r.VersionedStruct(r.uint32, {\n header: {\n horizAxis: new r.Pointer(r.uint16, Axis), // May be NULL\n vertAxis: new r.Pointer(r.uint16, Axis) // May be NULL\n },\n\n 0x00010000: {},\n 0x00010001: {\n itemVariationStore: new r.Pointer(r.uint32, ItemVariationStore)\n }\n});\n", "import * as r from 'restructure';\nimport { Coverage, ClassDef, Device } from './opentype';\nimport { ItemVariationStore } from './variations';\n\nlet AttachPoint = new r.Array(r.uint16, r.uint16);\nlet AttachList = new r.Struct({\n coverage: new r.Pointer(r.uint16, Coverage),\n glyphCount: r.uint16,\n attachPoints: new r.Array(new r.Pointer(r.uint16, AttachPoint), 'glyphCount')\n});\n\nlet CaretValue = new r.VersionedStruct(r.uint16, {\n 1: { // Design units only\n coordinate: r.int16\n },\n\n 2: { // Contour point\n caretValuePoint: r.uint16\n },\n\n 3: { // Design units plus Device table\n coordinate: r.int16,\n deviceTable: new r.Pointer(r.uint16, Device)\n }\n});\n\nlet LigGlyph = new r.Array(new r.Pointer(r.uint16, CaretValue), r.uint16);\n\nlet LigCaretList = new r.Struct({\n coverage: new r.Pointer(r.uint16, Coverage),\n ligGlyphCount: r.uint16,\n ligGlyphs: new r.Array(new r.Pointer(r.uint16, LigGlyph), 'ligGlyphCount')\n});\n\nlet MarkGlyphSetsDef = new r.Struct({\n markSetTableFormat: r.uint16,\n markSetCount: r.uint16,\n coverage: new r.Array(new r.Pointer(r.uint32, Coverage), 'markSetCount')\n});\n\n/** @type {import('restructure').VersionedStruct} */\nexport default new r.VersionedStruct(r.uint32, {\n header: {\n glyphClassDef: new r.Pointer(r.uint16, ClassDef),\n attachList: new r.Pointer(r.uint16, AttachList),\n ligCaretList: new r.Pointer(r.uint16, LigCaretList),\n markAttachClassDef: new r.Pointer(r.uint16, ClassDef)\n },\n\n 0x00010000: {},\n 0x00010002: {\n markGlyphSetsDef: new r.Pointer(r.uint16, MarkGlyphSetsDef)\n },\n 0x00010003: {\n markGlyphSetsDef: new r.Pointer(r.uint16, MarkGlyphSetsDef),\n itemVariationStore: new r.Pointer(r.uint32, ItemVariationStore)\n }\n});\n", "import * as r from 'restructure';\nimport { ScriptList, FeatureList, LookupList, Coverage, ClassDef, Device, Context, ChainingContext } from './opentype';\nimport { FeatureVariations } from './variations';\n\n/** @typedef {import('restructure').BaseType} BaseType */\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').Struct} Struct */\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('restructure').Pointer} Pointer */\n\nlet ValueFormat = new r.Bitfield(r.uint16, [\n 'xPlacement', 'yPlacement',\n 'xAdvance', 'yAdvance',\n 'xPlaDevice', 'yPlaDevice',\n 'xAdvDevice', 'yAdvDevice'\n]);\n\n/** @type {Record<string, BaseType>} */\nlet types = {\n xPlacement: r.int16,\n yPlacement: r.int16,\n xAdvance: r.int16,\n yAdvance: r.int16,\n xPlaDevice: new r.Pointer(r.uint16, Device, {\n type: 'global',\n /** @param {StructValue} ctx @returns {number} */\n relativeTo: ctx => /** @type {number} */ (ctx.rel)\n }),\n yPlaDevice: new r.Pointer(r.uint16, Device, {\n type: 'global',\n /** @param {StructValue} ctx @returns {number} */\n relativeTo: ctx => /** @type {number} */ (ctx.rel)\n }),\n xAdvDevice: new r.Pointer(r.uint16, Device, {\n type: 'global',\n /** @param {StructValue} ctx @returns {number} */\n relativeTo: ctx => /** @type {number} */ (ctx.rel)\n }),\n yAdvDevice: new r.Pointer(r.uint16, Device, {\n type: 'global',\n /** @param {StructValue} ctx @returns {number} */\n relativeTo: ctx => /** @type {number} */ (ctx.rel)\n })\n};\n\n/**\n * Dynamic GPOS value record whose fields depend on a ValueFormat bitfield.\n * @implements {BaseType}\n */\nclass ValueRecord {\n /**\n * @param {string} [key]\n */\n constructor(key = 'valueFormat') {\n /** @type {string} */\n this.key = key;\n }\n\n /**\n * @param {StructValue | null | undefined} parent\n * @returns {Struct | undefined}\n */\n buildStruct(parent) {\n let struct = parent;\n while (struct && !struct[this.key] && struct.parent) {\n struct = struct.parent;\n }\n\n if (!struct || !struct[this.key]) return;\n\n /** @type {Record<string, BaseType | ((this: StructValue, parent: StructValue) => unknown)>} */\n let fields = {};\n let start = struct;\n fields.rel = () => start._startOffset;\n\n let format = /** @type {Record<string, boolean>} */ (struct[this.key]);\n for (let key of Object.keys(format)) {\n if (format[key] && types[key]) {\n fields[key] = types[key];\n }\n }\n\n return new r.Struct(fields);\n }\n\n /**\n * @param {unknown} val\n * @param {StructValue | null | undefined} ctx\n * @returns {number}\n */\n size(val, ctx) {\n let s = this.buildStruct(ctx);\n return s ? s.size(/** @type {StructValue} */ (val), ctx) : 0;\n }\n\n /**\n * @param {DecodeStream} stream\n * @param {StructValue | null | undefined} parent\n * @returns {StructValue | undefined}\n */\n decode(stream, parent) {\n let s = this.buildStruct(parent);\n if (!s) return;\n let res = s.decode(stream, parent);\n delete res.rel;\n return res;\n }\n}\n\nlet PairValueRecord = new r.Struct({\n secondGlyph: r.uint16,\n value1: new ValueRecord('valueFormat1'),\n value2: new ValueRecord('valueFormat2')\n});\n\nlet PairSet = new r.Array(PairValueRecord, r.uint16);\n\nlet Class2Record = new r.Struct({\n value1: new ValueRecord('valueFormat1'),\n value2: new ValueRecord('valueFormat2')\n});\n\nlet Anchor = new r.VersionedStruct(r.uint16, {\n 1: { // Design units only\n xCoordinate: r.int16,\n yCoordinate: r.int16\n },\n\n 2: { // Design units plus contour point\n xCoordinate: r.int16,\n yCoordinate: r.int16,\n anchorPoint: r.uint16\n },\n\n 3: { // Design units plus Device tables\n xCoordinate: r.int16,\n yCoordinate: r.int16,\n xDeviceTable: new r.Pointer(r.uint16, Device),\n yDeviceTable: new r.Pointer(r.uint16, Device)\n }\n});\n\nlet EntryExitRecord = new r.Struct({\n entryAnchor: new r.Pointer(r.uint16, Anchor, { type: 'parent' }),\n exitAnchor: new r.Pointer(r.uint16, Anchor, { type: 'parent' })\n});\n\nlet MarkRecord = new r.Struct({\n class: r.uint16,\n markAnchor: new r.Pointer(r.uint16, Anchor, { type: 'parent' })\n});\n\nlet MarkArray = new r.Array(MarkRecord, r.uint16);\n\nlet BaseRecord = new r.Array(\n new r.Pointer(r.uint16, Anchor),\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (/** @type {StructValue} */ (t.parent).classCount)\n);\nlet BaseArray = new r.Array(BaseRecord, r.uint16);\n\nlet ComponentRecord = new r.Array(\n new r.Pointer(r.uint16, Anchor),\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (\n /** @type {StructValue} */ (/** @type {StructValue} */ (t.parent).parent).classCount\n )\n);\nlet LigatureAttach = new r.Array(ComponentRecord, r.uint16);\nlet LigatureArray = new r.Array(new r.Pointer(r.uint16, LigatureAttach), r.uint16);\n\n/** @type {import('restructure').VersionedStruct} */\nlet GPOSLookup = new r.VersionedStruct('lookupType', {\n 1: new r.VersionedStruct(r.uint16, { // Single Adjustment\n 1: { // Single positioning value\n coverage: new r.Pointer(r.uint16, Coverage),\n valueFormat: ValueFormat,\n value: new ValueRecord()\n },\n 2: {\n coverage: new r.Pointer(r.uint16, Coverage),\n valueFormat: ValueFormat,\n valueCount: r.uint16,\n values: new r.LazyArray(new ValueRecord(), 'valueCount')\n }\n }),\n\n 2: new r.VersionedStruct(r.uint16, { // Pair Adjustment Positioning\n 1: { // Adjustments for glyph pairs\n coverage: new r.Pointer(r.uint16, Coverage),\n valueFormat1: ValueFormat,\n valueFormat2: ValueFormat,\n pairSetCount: r.uint16,\n pairSets: new r.LazyArray(new r.Pointer(r.uint16, PairSet), 'pairSetCount')\n },\n\n 2: { // Class pair adjustment\n coverage: new r.Pointer(r.uint16, Coverage),\n valueFormat1: ValueFormat,\n valueFormat2: ValueFormat,\n classDef1: new r.Pointer(r.uint16, ClassDef),\n classDef2: new r.Pointer(r.uint16, ClassDef),\n class1Count: r.uint16,\n class2Count: r.uint16,\n classRecords: new r.LazyArray(new r.LazyArray(Class2Record, 'class2Count'), 'class1Count')\n }\n }),\n\n 3: { // Cursive Attachment Positioning\n format: r.uint16,\n coverage: new r.Pointer(r.uint16, Coverage),\n entryExitCount: r.uint16,\n entryExitRecords: new r.Array(EntryExitRecord, 'entryExitCount')\n },\n\n 4: { // MarkToBase Attachment Positioning\n format: r.uint16,\n markCoverage: new r.Pointer(r.uint16, Coverage),\n baseCoverage: new r.Pointer(r.uint16, Coverage),\n classCount: r.uint16,\n markArray: new r.Pointer(r.uint16, MarkArray),\n baseArray: new r.Pointer(r.uint16, BaseArray)\n },\n\n 5: { // MarkToLigature Attachment Positioning\n format: r.uint16,\n markCoverage: new r.Pointer(r.uint16, Coverage),\n ligatureCoverage: new r.Pointer(r.uint16, Coverage),\n classCount: r.uint16,\n markArray: new r.Pointer(r.uint16, MarkArray),\n ligatureArray: new r.Pointer(r.uint16, LigatureArray)\n },\n\n 6: { // MarkToMark Attachment Positioning\n format: r.uint16,\n mark1Coverage: new r.Pointer(r.uint16, Coverage),\n mark2Coverage: new r.Pointer(r.uint16, Coverage),\n classCount: r.uint16,\n mark1Array: new r.Pointer(r.uint16, MarkArray),\n mark2Array: new r.Pointer(r.uint16, BaseArray)\n },\n\n 7: Context, // Contextual positioning\n 8: ChainingContext, // Chaining contextual positioning\n\n 9: { // Extension Positioning\n posFormat: r.uint16,\n lookupType: r.uint16, // cannot also be 9\n extension: new r.Pointer(r.uint32, null)\n }\n});\n\n// Fix circular reference\nlet gposExt = /** @type {Record<string, BaseType>} */ (GPOSLookup.versions[9]);\n/** @type {Pointer} */ (gposExt.extension).type = GPOSLookup;\n\n/** @type {import('restructure').VersionedStruct} */\nexport default new r.VersionedStruct(r.uint32, {\n header: {\n scriptList: new r.Pointer(r.uint16, ScriptList),\n featureList: new r.Pointer(r.uint16, FeatureList),\n lookupList: new r.Pointer(r.uint16, LookupList(GPOSLookup))\n },\n\n 0x00010000: {},\n 0x00010001: {\n featureVariations: new r.Pointer(r.uint32, FeatureVariations)\n }\n});\n\n// export GPOSLookup for JSTF table\nexport { GPOSLookup };\n", "import * as r from 'restructure';\nimport { ScriptList, FeatureList, LookupList, Coverage, Context, ChainingContext } from './opentype';\nimport { FeatureVariations } from './variations';\n\n/** @typedef {import('restructure').BaseType} BaseType */\n/** @typedef {import('restructure').Pointer} Pointer */\n/** @typedef {import('restructure').StructValue} StructValue */\n\nlet Sequence = new r.Array(r.uint16, r.uint16);\nlet AlternateSet = Sequence;\n\nlet Ligature = new r.Struct({\n glyph: r.uint16,\n compCount: r.uint16,\n components: new r.Array(\n r.uint16,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.compCount) - 1\n )\n});\n\nlet LigatureSet = new r.Array(new r.Pointer(r.uint16, Ligature), r.uint16);\n\n/** @type {import('restructure').VersionedStruct} */\nlet GSUBLookup = new r.VersionedStruct('lookupType', {\n 1: new r.VersionedStruct(r.uint16, { // Single Substitution\n 1: {\n coverage: new r.Pointer(r.uint16, Coverage),\n deltaGlyphID: r.int16\n },\n 2: {\n coverage: new r.Pointer(r.uint16, Coverage),\n glyphCount: r.uint16,\n substitute: new r.LazyArray(r.uint16, 'glyphCount')\n }\n }),\n\n 2: { // Multiple Substitution\n substFormat: r.uint16,\n coverage: new r.Pointer(r.uint16, Coverage),\n count: r.uint16,\n sequences: new r.LazyArray(new r.Pointer(r.uint16, Sequence), 'count')\n },\n\n 3: { // Alternate Substitution\n substFormat: r.uint16,\n coverage: new r.Pointer(r.uint16, Coverage),\n count: r.uint16,\n alternateSet: new r.LazyArray(new r.Pointer(r.uint16, AlternateSet), 'count')\n },\n\n 4: { // Ligature Substitution\n substFormat: r.uint16,\n coverage: new r.Pointer(r.uint16, Coverage),\n count: r.uint16,\n ligatureSets: new r.LazyArray(new r.Pointer(r.uint16, LigatureSet), 'count')\n },\n\n 5: Context, // Contextual Substitution\n 6: ChainingContext, // Chaining Contextual Substitution\n\n 7: { // Extension Substitution\n substFormat: r.uint16,\n lookupType: r.uint16, // cannot also be 7\n extension: new r.Pointer(r.uint32, null)\n },\n\n 8: { // Reverse Chaining Contextual Single Substitution\n substFormat: r.uint16,\n coverage: new r.Pointer(r.uint16, Coverage),\n backtrackGlyphCount: r.uint16,\n backtrackCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'backtrackGlyphCount'),\n lookaheadGlyphCount: r.uint16,\n lookaheadCoverage: new r.Array(new r.Pointer(r.uint16, Coverage), 'lookaheadGlyphCount'),\n glyphCount: r.uint16,\n substitute: new r.LazyArray(r.uint16, 'glyphCount')\n }\n});\n\n// Fix circular reference\nlet gsubExt = /** @type {Record<string, BaseType>} */ (GSUBLookup.versions[7]);\n/** @type {Pointer} */ (gsubExt.extension).type = GSUBLookup;\n\n/** @type {import('restructure').VersionedStruct} */\nexport default new r.VersionedStruct(r.uint32, {\n header: {\n scriptList: new r.Pointer(r.uint16, ScriptList),\n featureList: new r.Pointer(r.uint16, FeatureList),\n lookupList: new r.Pointer(r.uint16, LookupList(GSUBLookup))\n },\n\n 0x00010000: {},\n 0x00010001: {\n featureVariations: new r.Pointer(r.uint32, FeatureVariations)\n }\n});\n", "import * as r from 'restructure';\nimport { LookupList } from './opentype';\nimport { GPOSLookup } from './GPOS';\n\nlet JstfGSUBModList = new r.Array(r.uint16, r.uint16);\n\nlet JstfPriority = new r.Struct({\n shrinkageEnableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),\n shrinkageDisableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),\n shrinkageEnableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),\n shrinkageDisableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),\n shrinkageJstfMax: new r.Pointer(r.uint16, LookupList(GPOSLookup)),\n extensionEnableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),\n extensionDisableGSUB: new r.Pointer(r.uint16, JstfGSUBModList),\n extensionEnableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),\n extensionDisableGPOS: new r.Pointer(r.uint16, JstfGSUBModList),\n extensionJstfMax: new r.Pointer(r.uint16, LookupList(GPOSLookup))\n});\n\nlet JstfLangSys = new r.Array(new r.Pointer(r.uint16, JstfPriority), r.uint16);\n\nlet JstfLangSysRecord = new r.Struct({\n tag: new r.String(4),\n jstfLangSys: new r.Pointer(r.uint16, JstfLangSys)\n});\n\nlet JstfScript = new r.Struct({\n extenderGlyphs: new r.Pointer(r.uint16, new r.Array(r.uint16, r.uint16)), // array of glyphs to extend line length\n defaultLangSys: new r.Pointer(r.uint16, JstfLangSys),\n langSysCount: r.uint16,\n langSysRecords: new r.Array(JstfLangSysRecord, 'langSysCount')\n});\n\nlet JstfScriptRecord = new r.Struct({\n tag: new r.String(4),\n script: new r.Pointer(r.uint16, JstfScript, { type: 'parent' })\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.uint32, // should be 0x00010000\n scriptCount: r.uint16,\n scriptList: new r.Array(JstfScriptRecord, 'scriptCount')\n});\n", "import * as r from 'restructure';\nimport { resolveLength } from 'restructure';\nimport { ItemVariationStore } from './variations';\n\n/** @typedef {import('restructure').BaseType} BaseType */\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').LengthSpec} LengthSpec */\n/** @typedef {import('restructure').StructValue} StructValue */\n\n/**\n * Integer whose byte width is computed from a LengthSpec.\n * @implements {BaseType}\n */\nclass VariableSizeNumber {\n /**\n * @param {LengthSpec} size\n */\n constructor(size) {\n /** @type {LengthSpec} */\n this._size = size;\n }\n\n /**\n * @param {DecodeStream} stream\n * @param {StructValue | null | undefined} parent\n * @returns {number}\n */\n decode(stream, parent) {\n switch (this.size(0, parent)) {\n case 1: return stream.readUInt8();\n case 2: return stream.readUInt16BE();\n case 3: return stream.readUInt24BE();\n case 4: return stream.readUInt32BE();\n default: throw new Error(`Unsupported VariableSizeNumber width`);\n }\n }\n\n /**\n * @param {unknown} _val\n * @param {StructValue | null | undefined} [parent]\n * @returns {number}\n */\n size(_val, parent) {\n return resolveLength(this._size, null, parent);\n }\n}\n\nlet MapDataEntry = new r.Struct({\n entry: new VariableSizeNumber(\n /** @param {StructValue} t @returns {number} */\n (t) => {\n let parent = /** @type {StructValue} */ (t.parent);\n return ((/** @type {number} */ (parent.entryFormat) & 0x0030) >> 4) + 1;\n }\n ),\n /**\n * @param {StructValue} t\n * @returns {number}\n */\n outerIndex: (t) => {\n let parent = /** @type {StructValue} */ (t.parent);\n let entryFormat = /** @type {number} */ (parent.entryFormat);\n return /** @type {number} */ (t.entry) >> ((entryFormat & 0x000F) + 1);\n },\n /**\n * @param {StructValue} t\n * @returns {number}\n */\n innerIndex: (t) => {\n let parent = /** @type {StructValue} */ (t.parent);\n let entryFormat = /** @type {number} */ (parent.entryFormat);\n return /** @type {number} */ (t.entry) & ((1 << ((entryFormat & 0x000F) + 1)) - 1);\n }\n});\n\nlet DeltaSetIndexMap = new r.Struct({\n entryFormat: r.uint16,\n mapCount: r.uint16,\n mapData: new r.Array(MapDataEntry, 'mapCount')\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n majorVersion: r.uint16,\n minorVersion: r.uint16,\n itemVariationStore: new r.Pointer(r.uint32, ItemVariationStore),\n advanceWidthMapping: new r.Pointer(r.uint32, DeltaSetIndexMap),\n LSBMapping: new r.Pointer(r.uint32, DeltaSetIndexMap),\n RSBMapping: new r.Pointer(r.uint32, DeltaSetIndexMap)\n});\n", "import * as r from 'restructure';\n\nlet Signature = new r.Struct({\n format: r.uint32,\n length: r.uint32,\n offset: r.uint32\n});\n\nlet SignatureBlock = new r.Struct({\n reserved: new r.Reserved(r.uint16, 2),\n cbSignature: r.uint32, // Length (in bytes) of the PKCS#7 packet in pbSignature\n signature: new r.Buffer('cbSignature')\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n ulVersion: r.uint32, // Version number of the DSIG table (0x00000001)\n usNumSigs: r.uint16, // Number of signatures in the table\n usFlag: r.uint16, // Permission flags\n signatures: new r.Array(Signature, 'usNumSigs'),\n signatureBlocks: new r.Array(SignatureBlock, 'usNumSigs')\n});\n", "import * as r from 'restructure';\n\nlet GaspRange = new r.Struct({\n rangeMaxPPEM: r.uint16, // Upper limit of range, in ppem\n rangeGaspBehavior: new r.Bitfield(r.uint16, [ // Flags describing desired rasterizer behavior\n 'grayscale', 'gridfit',\n 'symmetricSmoothing', 'symmetricGridfit' // only in version 1, for ClearType\n ])\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.uint16, // set to 0\n numRanges: r.uint16,\n gaspRanges: new r.Array(GaspRange, 'numRanges') // Sorted by ppem\n});\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\nlet DeviceRecord = new r.Struct({\n pixelSize: r.uint8,\n maximumWidth: r.uint8,\n widths: new r.Array(\n r.uint8,\n /** @param {StructValue} t @returns {number} */\n (t) => {\n let parent = /** @type {StructValue} */ (t.parent);\n let grand = /** @type {StructValue} */ (parent.parent);\n return /** @type {number} */ (/** @type {StructValue} */ (grand.maxp).numGlyphs);\n }\n )\n});\n\n// The Horizontal Device Metrics table stores integer advance widths scaled to particular pixel sizes\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.uint16,\n numRecords: r.int16,\n sizeDeviceRecord: r.int32,\n records: new r.Array(DeviceRecord, 'numRecords')\n});\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\nlet KernPair = new r.Struct({\n left: r.uint16,\n right: r.uint16,\n value: r.int16\n});\n\nlet ClassTable = new r.Struct({\n firstGlyph: r.uint16,\n nGlyphs: r.uint16,\n offsets: new r.Array(r.uint16, 'nGlyphs'),\n /**\n * @param {StructValue} t\n * @returns {number}\n */\n max: (t) => {\n let offsets = /** @type {number[]} */ (t.offsets);\n return offsets.length ? Math.max.apply(Math, offsets) : 0;\n }\n});\n\nlet Kern2Array = new r.Struct({\n /**\n * @param {StructValue} t\n * @returns {number}\n */\n off: t => /** @type {number} */ (t._startOffset)\n - /** @type {number} */ (/** @type {StructValue} */ (/** @type {StructValue} */ (t.parent).parent)._startOffset),\n /**\n * @param {StructValue} t\n * @returns {number}\n */\n len: (t) => {\n let parent = /** @type {StructValue} */ (t.parent);\n let leftTable = /** @type {StructValue} */ (parent.leftTable);\n let rowWidth = /** @type {number} */ (parent.rowWidth);\n let off = /** @type {number} */ (t.off);\n return (((/** @type {number} */ (leftTable.max) - off) / rowWidth) + 1) * (rowWidth / 2);\n },\n values: new r.LazyArray(r.int16, 'len')\n});\n\nlet KernSubtable = new r.VersionedStruct('format', {\n 0: {\n nPairs: r.uint16,\n searchRange: r.uint16,\n entrySelector: r.uint16,\n rangeShift: r.uint16,\n pairs: new r.Array(KernPair, 'nPairs')\n },\n\n 2: {\n rowWidth: r.uint16,\n leftTable: new r.Pointer(r.uint16, ClassTable, { type: 'parent' }),\n rightTable: new r.Pointer(r.uint16, ClassTable, { type: 'parent' }),\n array: new r.Pointer(r.uint16, Kern2Array, { type: 'parent' })\n },\n\n 3: {\n glyphCount: r.uint16,\n kernValueCount: r.uint8,\n leftClassCount: r.uint8,\n rightClassCount: r.uint8,\n flags: r.uint8,\n kernValue: new r.Array(r.int16, 'kernValueCount'),\n leftClass: new r.Array(r.uint8, 'glyphCount'),\n rightClass: new r.Array(r.uint8, 'glyphCount'),\n kernIndex: new r.Array(\n r.uint8,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.leftClassCount) * /** @type {number} */ (t.rightClassCount)\n )\n }\n});\n\nlet KernTable = new r.VersionedStruct('version', {\n 0: { // Microsoft uses this format\n subVersion: r.uint16, // Microsoft has an extra sub-table version number\n length: r.uint16, // Length of the subtable, in bytes\n format: r.uint8, // Format of subtable\n coverage: new r.Bitfield(r.uint8, [\n 'horizontal', // 1 if table has horizontal data, 0 if vertical\n 'minimum', // If set to 1, the table has minimum values. If set to 0, the table has kerning values.\n 'crossStream', // If set to 1, kerning is perpendicular to the flow of the text\n 'override' // If set to 1 the value in this table replaces the accumulated value\n ]),\n subtable: KernSubtable,\n padding: new r.Reserved(\n r.uint8,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.length) - /** @type {number} */ (t._currentOffset)\n )\n },\n 1: { // Apple uses this format\n length: r.uint32,\n coverage: new r.Bitfield(r.uint8, [\n null, null, null, null, null,\n 'variation', // Set if table has variation kerning values\n 'crossStream', // Set if table has cross-stream kerning values\n 'vertical' // Set if table has vertical kerning values\n ]),\n format: r.uint8,\n tupleIndex: r.uint16,\n subtable: KernSubtable,\n padding: new r.Reserved(\n r.uint8,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.length) - /** @type {number} */ (t._currentOffset)\n )\n }\n});\n\n/** @type {import('restructure').VersionedStruct} */\nexport default new r.VersionedStruct(r.uint16, {\n 0: { // Microsoft Version\n nTables: r.uint16,\n tables: new r.Array(KernTable, 'nTables')\n },\n\n 1: { // Apple Version\n reserved: new r.Reserved(r.uint16), // the other half of the version number\n nTables: r.uint32,\n tables: new r.Array(KernTable, 'nTables')\n }\n});\n", "import * as r from 'restructure';\n\n// Linear Threshold table\n// Records the ppem for each glyph at which the scaling becomes linear again,\n// despite instructions effecting the advance width\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.uint16,\n numGlyphs: r.uint16,\n yPels: new r.Array(r.uint8, 'numGlyphs')\n});\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').BaseType} BaseType */\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').EncodeStream} EncodeStream */\n/** @typedef {import('restructure').StructValue} StructValue */\n\nlet AxisRecord = new r.Struct({\n axisTag: new r.String(4),\n axisNameID: r.uint16,\n axisOrdering: r.uint16\n});\n\n// Formats 1\u20133 share axisIndex after format; format 4 uses axisCount instead.\nlet AxisValue = new r.VersionedStruct(r.uint16, {\n 1: {\n axisIndex: r.uint16,\n flags: r.uint16,\n valueNameID: r.uint16,\n value: r.fixed32\n },\n 2: {\n axisIndex: r.uint16,\n flags: r.uint16,\n valueNameID: r.uint16,\n nominalValue: r.fixed32,\n rangeMinValue: r.fixed32,\n rangeMaxValue: r.fixed32\n },\n 3: {\n axisIndex: r.uint16,\n flags: r.uint16,\n valueNameID: r.uint16,\n value: r.fixed32,\n linkedValue: r.fixed32\n },\n 4: {\n axisCount: r.uint16,\n flags: r.uint16,\n valueNameID: r.uint16,\n axisValues: new r.Array(new r.Struct({\n axisIndex: r.uint16,\n value: r.fixed32\n }), 'axisCount')\n }\n});\n\nlet AxisValueArray = new r.Struct({\n axisValues: new r.Array(\n new r.Pointer(r.uint16, AxisValue),\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (/** @type {StructValue} */ (t.parent).axisValueCount)\n )\n});\n\n/**\n * Design-axis array whose record stride is designAxisSize (OpenType forward-compat).\n * @implements {BaseType}\n */\nclass DesignAxisArray {\n /**\n * @param {StructValue | null | undefined} parent\n * @returns {number}\n */\n _stride(parent) {\n // Spec requires room for Tag + 2\u00D7uint16 (8 bytes); never shrink below that.\n let fromParent = parent ? /** @type {number | undefined} */ (parent.designAxisSize) : undefined;\n let fromVal = parent && parent.val\n ? /** @type {number | undefined} */ (/** @type {StructValue} */ (parent.val).designAxisSize)\n : undefined;\n return Math.max(8, fromParent ?? fromVal ?? 8);\n }\n\n /**\n * @param {DecodeStream} stream\n * @param {StructValue | null | undefined} parent\n * @returns {StructValue[]}\n */\n decode(stream, parent) {\n let count = parent ? /** @type {number} */ (parent.designAxisCount) : 0;\n let size = this._stride(parent);\n /** @type {StructValue[]} */\n let res = [];\n for (let i = 0; i < count; i++) {\n let start = stream.pos;\n res.push(AxisRecord.decode(stream, parent));\n stream.pos = start + size;\n }\n return res;\n }\n\n /**\n * @param {unknown} array\n * @param {StructValue | null | undefined} parent\n * @returns {number}\n */\n size(array, parent) {\n let len = Array.isArray(array) ? array.length : 0;\n return len * this._stride(parent);\n }\n\n /**\n * @param {EncodeStream} stream\n * @param {unknown} array\n * @param {StructValue | null | undefined} parent\n * @returns {void}\n */\n encode(stream, array, parent) {\n let size = this._stride(parent);\n let items = Array.isArray(array) ? /** @type {StructValue[]} */ (array) : [];\n for (let item of items) {\n let start = stream.pos;\n AxisRecord.encode(stream, item, parent);\n let pad = size - (stream.pos - start);\n if (pad > 0) {\n stream.fill(0, pad);\n }\n }\n }\n}\n\n/** @type {import('restructure').VersionedStruct} */\nexport default new r.VersionedStruct(r.uint32, {\n header: {\n designAxisSize: r.uint16,\n designAxisCount: r.uint16,\n offsetToDesignAxes: new r.Pointer(r.uint32, new DesignAxisArray()),\n axisValueCount: r.uint16,\n offsetToAxisValueOffsets: new r.Pointer(r.uint32, AxisValueArray)\n },\n 0x00010000: {},\n 0x00010001: {\n elidedFallbackNameID: r.uint16\n },\n // v1.2: same header as v1.1; adds AxisValue format 4.\n 0x00010002: {\n elidedFallbackNameID: r.uint16\n }\n});\n", "import * as r from 'restructure';\n\n// PCL 5 Table\n// NOTE: The PCLT table is strongly discouraged for OpenType fonts with TrueType outlines\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.uint16,\n fontNumber: r.uint32,\n pitch: r.uint16,\n xHeight: r.uint16,\n style: r.uint16,\n typeFamily: r.uint16,\n capHeight: r.uint16,\n symbolSet: r.uint16,\n typeface: new r.String(16),\n characterComplement: new r.String(8),\n fileName: new r.String(6),\n strokeWeight: new r.String(1),\n widthType: new r.String(1),\n serifStyle: r.uint8,\n reserved: new r.Reserved(r.uint8)\n});\n", "import * as r from 'restructure';\n\n// VDMX tables contain ascender/descender overrides for certain (usually small)\n// sizes. This is needed in order to match font metrics on Windows.\n\nlet Ratio = new r.Struct({\n bCharSet: r.uint8, // Character set\n xRatio: r.uint8, // Value to use for x-Ratio\n yStartRatio: r.uint8, // Starting y-Ratio value\n yEndRatio: r.uint8 // Ending y-Ratio value\n});\n\nlet vTable = new r.Struct({\n yPelHeight: r.uint16, // yPelHeight to which values apply\n yMax: r.int16, // Maximum value (in pels) for this yPelHeight\n yMin: r.int16 // Minimum value (in pels) for this yPelHeight\n});\n\nlet VdmxGroup = new r.Struct({\n recs: r.uint16, // Number of height records in this group\n startsz: r.uint8, // Starting yPelHeight\n endsz: r.uint8, // Ending yPelHeight\n entries: new r.Array(vTable, 'recs') // The VDMX records\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.uint16, // Version number (0 or 1)\n numRecs: r.uint16, // Number of VDMX groups present\n numRatios: r.uint16, // Number of aspect ratio groupings\n ratioRanges: new r.Array(Ratio, 'numRatios'), // Ratio ranges\n offsets: new r.Array(r.uint16, 'numRatios'), // Offset to the VDMX group for this ratio range\n groups: new r.Array(VdmxGroup, 'numRecs') // The actual VDMX groupings\n});\n", "import * as r from 'restructure';\n\n// Vertical Header Table\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.fixed32, // Version number of the Vertical Header Table\n ascent: r.int16, // The vertical typographic ascender for this font\n descent: r.int16, // The vertical typographic descender for this font\n lineGap: r.int16, // The vertical typographic line gap for this font\n advanceHeightMax: r.uint16, // The maximum advance height measurement found in the font\n minTopSideBearing: r.int16, // The minimum top side bearing measurement found in the font\n minBottomSideBearing: r.int16, // The minimum bottom side bearing measurement found in the font\n yMaxExtent: r.int16,\n caretSlopeRise: r.int16, // Caret slope (rise/run)\n caretSlopeRun: r.int16,\n caretOffset: r.int16, // Set value equal to 0 for nonslanted fonts\n reserved: new r.Reserved(r.int16, 4),\n metricDataFormat: r.int16, // Set to 0\n numberOfMetrics: r.uint16 // Number of advance heights in the Vertical Metrics table\n});\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\nlet VmtxEntry = new r.Struct({\n advance: r.uint16, // The advance height of the glyph\n bearing: r.int16 // The top sidebearing of the glyph\n});\n\n// Vertical Metrics Table\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n metrics: new r.LazyArray(\n VmtxEntry,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (/** @type {StructValue} */ (/** @type {StructValue} */ (t.parent).vhea).numberOfMetrics)\n ),\n bearings: new r.LazyArray(\n r.int16,\n /** @param {StructValue} t @returns {number} */\n (t) => {\n let parent = /** @type {StructValue} */ (t.parent);\n let maxp = /** @type {StructValue} */ (parent.maxp);\n let vhea = /** @type {StructValue} */ (parent.vhea);\n return /** @type {number} */ (maxp.numGlyphs) - /** @type {number} */ (vhea.numberOfMetrics);\n }\n )\n});\n", "import * as r from 'restructure';\n\nlet shortFrac = new r.Fixed(16, 'BE', 14);\n\nlet Correspondence = new r.Struct({\n fromCoord: shortFrac,\n toCoord: shortFrac\n});\n\nlet Segment = new r.Struct({\n pairCount: r.uint16,\n correspondence: new r.Array(Correspondence, 'pairCount')\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.fixed32,\n axisCount: r.uint32,\n segment: new r.Array(Segment, 'axisCount')\n});\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').BaseType} BaseType */\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').EncodeStream} EncodeStream */\n/** @typedef {import('restructure').StructFields} StructFields */\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('restructure').VersionedStruct} VersionedStruct */\n\n/**\n * Lazy random-access view over an unbounded run of encoded items.\n */\nclass UnboundedArrayAccessor {\n /**\n * @param {BaseType} type\n * @param {DecodeStream} stream\n * @param {StructValue | null | undefined} parent\n */\n constructor(type, stream, parent) {\n /** @type {BaseType} */\n this.type = type;\n /** @type {DecodeStream} */\n this.stream = stream;\n /** @type {StructValue | null | undefined} */\n this.parent = parent;\n /** @type {number} */\n this.base = this.stream.pos;\n /** @type {unknown[]} */\n this._items = [];\n }\n\n /**\n * @param {number} index\n * @returns {unknown}\n */\n getItem(index) {\n if (this._items[index] == null) {\n let pos = this.stream.pos;\n let itemSize = this.type.size?.(null, this.parent);\n this.stream.pos = this.base + /** @type {number} */ (itemSize) * index;\n this._items[index] = this.type.decode?.(this.stream, this.parent);\n this.stream.pos = pos;\n }\n\n return this._items[index];\n }\n\n /**\n * @returns {string}\n */\n inspect() {\n let name = this.type.constructor && this.type.constructor.name\n ? this.type.constructor.name\n : 'Type';\n return `[UnboundedArray ${name}]`;\n }\n}\n\n/**\n * Array whose length is not stored; consumers index via getItem().\n * @implements {BaseType}\n */\nexport class UnboundedArray {\n /**\n * @param {BaseType} type\n */\n constructor(type) {\n /** @type {BaseType} */\n this.type = type;\n }\n\n /**\n * @param {DecodeStream} stream\n * @param {StructValue | null | undefined} parent\n * @returns {UnboundedArrayAccessor}\n */\n decode(stream, parent) {\n return new UnboundedArrayAccessor(this.type, stream, parent);\n }\n}\n\n/**\n * @param {BaseType} [ValueType]\n * @returns {VersionedStruct}\n */\nexport function LookupTable(ValueType = r.uint16) {\n /**\n * Re-parents decode/encode so internal lookup structs stay invisible to pointers.\n * @implements {BaseType}\n */\n class Shadow {\n /**\n * @param {BaseType} type\n */\n constructor(type) {\n /** @type {BaseType} */\n this.type = type;\n }\n\n /**\n * @param {DecodeStream} stream\n * @param {StructValue | null | undefined} ctx\n * @returns {unknown}\n */\n decode(stream, ctx) {\n let parent = ctx && ctx.parent && ctx.parent.parent ? ctx.parent.parent : ctx;\n return this.type.decode?.(stream, parent);\n }\n\n /**\n * @param {unknown} val\n * @param {StructValue | null | undefined} ctx\n * @returns {number}\n */\n size(val, ctx) {\n let parent = ctx && ctx.parent && ctx.parent.parent ? ctx.parent.parent : ctx;\n return /** @type {number} */ (this.type.size?.(val, parent));\n }\n\n /**\n * @param {EncodeStream | null} stream\n * @param {unknown} val\n * @param {StructValue | null | undefined} ctx\n * @returns {unknown}\n */\n encode(stream, val, ctx) {\n let parent = ctx && ctx.parent && ctx.parent.parent ? ctx.parent.parent : ctx;\n return this.type.encode?.(stream, val, parent);\n }\n }\n\n let shadowed = new Shadow(ValueType);\n\n let BinarySearchHeader = new r.Struct({\n unitSize: r.uint16,\n nUnits: r.uint16,\n searchRange: r.uint16,\n entrySelector: r.uint16,\n rangeShift: r.uint16\n });\n\n let LookupSegmentSingle = new r.Struct({\n lastGlyph: r.uint16,\n firstGlyph: r.uint16,\n value: shadowed\n });\n\n let LookupSegmentArray = new r.Struct({\n lastGlyph: r.uint16,\n firstGlyph: r.uint16,\n values: new r.Pointer(\n r.uint16,\n new r.Array(\n shadowed,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.lastGlyph) - /** @type {number} */ (t.firstGlyph) + 1\n ),\n { type: 'parent' }\n )\n });\n\n let LookupSingle = new r.Struct({\n glyph: r.uint16,\n value: shadowed\n });\n\n return new r.VersionedStruct(r.uint16, {\n 0: {\n values: new UnboundedArray(shadowed) // length == number of glyphs maybe?\n },\n 2: {\n binarySearchHeader: BinarySearchHeader,\n segments: new r.Array(\n LookupSegmentSingle,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (/** @type {StructValue} */ (t.binarySearchHeader).nUnits)\n )\n },\n 4: {\n binarySearchHeader: BinarySearchHeader,\n segments: new r.Array(\n LookupSegmentArray,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (/** @type {StructValue} */ (t.binarySearchHeader).nUnits)\n )\n },\n 6: {\n binarySearchHeader: BinarySearchHeader,\n segments: new r.Array(\n LookupSingle,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (/** @type {StructValue} */ (t.binarySearchHeader).nUnits)\n )\n },\n 8: {\n firstGlyph: r.uint16,\n count: r.uint16,\n values: new r.Array(shadowed, 'count')\n }\n });\n}\n\n/**\n * @param {StructFields} [entryData]\n * @param {BaseType} [lookupType]\n * @returns {import('restructure').Struct}\n */\nexport function StateTable(entryData = {}, lookupType = r.uint16) {\n let entry = Object.assign({\n newState: r.uint16,\n flags: r.uint16\n }, entryData);\n\n let Entry = new r.Struct(entry);\n let StateArray = new UnboundedArray(\n new r.Array(\n r.uint16,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.nClasses)\n )\n );\n\n return new r.Struct({\n nClasses: r.uint32,\n classTable: new r.Pointer(r.uint32, LookupTable(lookupType)),\n stateArray: new r.Pointer(r.uint32, StateArray),\n entryTable: new r.Pointer(r.uint32, new UnboundedArray(Entry))\n });\n}\n\n/**\n * Old (16-bit) StateTable structure.\n * @param {StructFields} [entryData]\n * @param {BaseType} [_lookupType]\n * @returns {import('restructure').Struct}\n */\nexport function StateTable1(entryData = {}, _lookupType = r.uint16) {\n let ClassLookupTable = new r.Struct({\n /** @returns {number} */\n version() { return 8; }, // simulate LookupTable\n firstGlyph: r.uint16,\n values: new r.Array(r.uint8, r.uint16)\n });\n\n let entry = Object.assign({\n newStateOffset: r.uint16,\n /**\n * Convert offset to stateArray index.\n * @param {StructValue} t\n * @returns {number}\n */\n newState: (t) => {\n /**\n * @typedef {{\n * stateArray: { base: number },\n * _startOffset: number,\n * nClasses: number\n * }} StateParent\n */\n let parent = /** @type {StructValue & StateParent} */ (t.parent);\n return (/** @type {number} */ (t.newStateOffset)\n - (parent.stateArray.base - parent._startOffset)) / parent.nClasses;\n },\n flags: r.uint16\n }, entryData);\n\n let Entry = new r.Struct(entry);\n let StateArray = new UnboundedArray(\n new r.Array(\n r.uint8,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.nClasses)\n )\n );\n\n return new r.Struct({\n nClasses: r.uint16,\n classTable: new r.Pointer(r.uint16, ClassLookupTable),\n stateArray: new r.Pointer(r.uint16, StateArray),\n entryTable: new r.Pointer(r.uint16, new UnboundedArray(Entry))\n });\n}\n", "import * as r from 'restructure';\nimport { LookupTable } from './aat';\n\nlet BslnSubtable = new r.VersionedStruct('format', {\n 0: { // Distance-based, no mapping\n deltas: new r.Array(r.int16, 32)\n },\n\n 1: { // Distance-based, with mapping\n deltas: new r.Array(r.int16, 32),\n mappingData: LookupTable(r.uint16)\n },\n\n 2: { // Control point-based, no mapping\n standardGlyph: r.uint16,\n controlPoints: new r.Array(r.uint16, 32)\n },\n\n 3: { // Control point-based, with mapping\n standardGlyph: r.uint16,\n controlPoints: new r.Array(r.uint16, 32),\n mappingData: LookupTable(r.uint16)\n }\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.fixed32,\n format: r.uint16,\n defaultBaseline: r.uint16,\n subtable: BslnSubtable\n});\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\n/**\n * @param {StructValue} t\n * @param {number} depth\n * @param {number} nameIndex\n * @returns {unknown}\n */\nfunction featureNameAt(t, depth, nameIndex) {\n let cur = t;\n for (let i = 0; i < depth; i++) {\n cur = /** @type {StructValue} */ (cur.parent);\n }\n let name = /** @type {StructValue} */ (cur.name);\n let records = /** @type {StructValue} */ (name.records);\n let fontFeatures = /** @type {Record<number, unknown>} */ (records.fontFeatures);\n return fontFeatures[nameIndex];\n}\n\nlet Setting = new r.Struct({\n setting: r.uint16,\n nameIndex: r.int16,\n /** @param {StructValue} t @returns {unknown} */\n name: t => featureNameAt(t, 3, /** @type {number} */ (t.nameIndex))\n});\n\nlet FeatureName = new r.Struct({\n feature: r.uint16,\n nSettings: r.uint16,\n settingTable: new r.Pointer(r.uint32, new r.Array(Setting, 'nSettings'), { type: 'parent' }),\n featureFlags: new r.Bitfield(r.uint8, [\n null, null, null, null, null, null,\n 'hasDefault', 'exclusive'\n ]),\n defaultSetting: r.uint8,\n nameIndex: r.int16,\n /** @param {StructValue} t @returns {unknown} */\n name: t => featureNameAt(t, 2, /** @type {number} */ (t.nameIndex))\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.fixed32,\n featureNameCount: r.uint16,\n reserved1: new r.Reserved(r.uint16),\n reserved2: new r.Reserved(r.uint32),\n featureNames: new r.Array(FeatureName, 'featureNameCount')\n});\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\n/**\n * @param {StructValue} t\n * @param {number} nameID\n * @returns {unknown}\n */\nfunction featureName(t, nameID) {\n let parent = /** @type {StructValue} */ (t.parent);\n let grand = /** @type {StructValue} */ (parent.parent);\n let name = /** @type {StructValue} */ (grand.name);\n let records = /** @type {StructValue} */ (name.records);\n let fontFeatures = /** @type {Record<number, unknown>} */ (records.fontFeatures);\n return fontFeatures[nameID];\n}\n\nlet Axis = new r.Struct({\n axisTag: new r.String(4),\n minValue: r.fixed32,\n defaultValue: r.fixed32,\n maxValue: r.fixed32,\n flags: r.uint16,\n nameID: r.uint16,\n /** @param {StructValue} t @returns {unknown} */\n name: t => featureName(t, /** @type {number} */ (t.nameID))\n});\n\nlet Instance = new r.Struct({\n nameID: r.uint16,\n /** @param {StructValue} t @returns {unknown} */\n name: t => featureName(t, /** @type {number} */ (t.nameID)),\n flags: r.uint16,\n coord: new r.Array(\n r.fixed32,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (/** @type {StructValue} */ (t.parent).axisCount)\n ),\n postscriptNameID: new r.Optional(\n r.uint16,\n /** @param {StructValue} t @returns {boolean} */\n t => /** @type {number} */ (/** @type {StructValue} */ (t.parent).instanceSize)\n - /** @type {number} */ (t._currentOffset) > 0\n )\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.fixed32,\n offsetToData: r.uint16,\n countSizePairs: r.uint16,\n axisCount: r.uint16,\n axisSize: r.uint16,\n instanceCount: r.uint16,\n instanceSize: r.uint16,\n axis: new r.Array(Axis, 'axisCount'),\n instance: new r.Array(Instance, 'instanceCount')\n});\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').BaseType} BaseType */\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').StructValue} StructValue */\n\nlet shortFrac = new r.Fixed(16, 'BE', 14);\n\n/**\n * Offset whose width depends on gvar.flags (Apple short/long format).\n * @implements {BaseType}\n */\nclass Offset {\n /**\n * @param {DecodeStream} stream\n * @param {StructValue | null | undefined} parent\n * @returns {number}\n */\n static decode(stream, parent) {\n // In short format, offsets are multiplied by 2.\n // This doesn't seem to be documented by Apple, but it\n // is implemented this way in Freetype.\n return parent && parent.flags\n ? stream.readUInt32BE()\n : stream.readUInt16BE() * 2;\n }\n}\n\n/** @type {import('restructure').Struct} */\nlet gvar = new r.Struct({\n version: r.uint16,\n reserved: new r.Reserved(r.uint16),\n axisCount: r.uint16,\n globalCoordCount: r.uint16,\n globalCoords: new r.Pointer(r.uint32, new r.Array(new r.Array(shortFrac, 'axisCount'), 'globalCoordCount')),\n glyphCount: r.uint16,\n flags: r.uint16,\n offsetToData: r.uint32,\n offsets: new r.Array(\n new r.Pointer(\n /** @type {BaseType} */ (Offset),\n 'void',\n {\n /** @param {StructValue} ctx @returns {number} */\n relativeTo: ctx => /** @type {number} */ (ctx.offsetToData),\n allowNull: false\n }\n ),\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.glyphCount) + 1\n )\n});\n\nexport default gvar;\n", "import * as r from 'restructure';\nimport { LookupTable, StateTable1 } from './aat';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\nlet ClassTable = new r.Struct({\n length: r.uint16,\n coverage: r.uint16,\n subFeatureFlags: r.uint32,\n stateTable: StateTable1()\n});\n\nlet WidthDeltaRecord = new r.Struct({\n justClass: r.uint32,\n beforeGrowLimit: r.fixed32,\n beforeShrinkLimit: r.fixed32,\n afterGrowLimit: r.fixed32,\n afterShrinkLimit: r.fixed32,\n growFlags: r.uint16,\n shrinkFlags: r.uint16\n});\n\nlet WidthDeltaCluster = new r.Array(WidthDeltaRecord, r.uint32);\n\nlet ActionData = new r.VersionedStruct('actionType', {\n 0: { // Decomposition action\n lowerLimit: r.fixed32,\n upperLimit: r.fixed32,\n order: r.uint16,\n glyphs: new r.Array(r.uint16, r.uint16)\n },\n\n 1: { // Unconditional add glyph action\n addGlyph: r.uint16\n },\n\n 2: { // Conditional add glyph action\n substThreshold: r.fixed32,\n addGlyph: r.uint16,\n substGlyph: r.uint16\n },\n\n 3: {}, // Stretch glyph action (no data, not supported by CoreText)\n\n 4: { // Ductile glyph action (not supported by CoreText)\n variationAxis: r.uint32,\n minimumLimit: r.fixed32,\n noStretchValue: r.fixed32,\n maximumLimit: r.fixed32\n },\n\n 5: { // Repeated add glyph action\n flags: r.uint16,\n glyph: r.uint16\n }\n});\n\nlet Action = new r.Struct({\n actionClass: r.uint16,\n actionType: r.uint16,\n actionLength: r.uint32,\n actionData: ActionData,\n padding: new r.Reserved(\n r.uint8,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.actionLength) - /** @type {number} */ (t._currentOffset)\n )\n});\n\nlet PostcompensationAction = new r.Array(Action, r.uint32);\nlet PostCompensationTable = new r.Struct({\n lookupTable: LookupTable(new r.Pointer(r.uint16, PostcompensationAction))\n});\n\nlet JustificationTable = new r.Struct({\n classTable: new r.Pointer(r.uint16, ClassTable, { type: 'parent' }),\n wdcOffset: r.uint16,\n postCompensationTable: new r.Pointer(r.uint16, PostCompensationTable, { type: 'parent' }),\n widthDeltaClusters: LookupTable(new r.Pointer(r.uint16, WidthDeltaCluster, {\n type: 'parent',\n /** @param {StructValue} ctx @returns {number} */\n relativeTo: ctx => /** @type {number} */ (ctx.wdcOffset)\n }))\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.uint32,\n format: r.uint16,\n horizontal: new r.Pointer(r.uint16, JustificationTable),\n vertical: new r.Pointer(r.uint16, JustificationTable)\n});\n", "import * as r from 'restructure';\nimport { UnboundedArray, LookupTable, StateTable } from './aat';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n\nlet LigatureData = {\n action: r.uint16\n};\n\nlet ContextualData = {\n markIndex: r.uint16,\n currentIndex: r.uint16\n};\n\nlet InsertionData = {\n currentInsertIndex: r.uint16,\n markedInsertIndex: r.uint16\n};\n\nlet SubstitutionTable = new r.Struct({\n items: new UnboundedArray(new r.Pointer(r.uint32, LookupTable()))\n});\n\nlet SubtableData = new r.VersionedStruct('type', {\n 0: { // Indic Rearrangement Subtable\n stateTable: StateTable()\n },\n\n 1: { // Contextual Glyph Substitution Subtable\n stateTable: StateTable(ContextualData),\n substitutionTable: new r.Pointer(r.uint32, SubstitutionTable)\n },\n\n 2: { // Ligature subtable\n stateTable: StateTable(LigatureData),\n ligatureActions: new r.Pointer(r.uint32, new UnboundedArray(r.uint32)),\n components: new r.Pointer(r.uint32, new UnboundedArray(r.uint16)),\n ligatureList: new r.Pointer(r.uint32, new UnboundedArray(r.uint16))\n },\n\n 4: { // Non-contextual Glyph Substitution Subtable\n lookupTable: LookupTable()\n },\n\n 5: { // Glyph Insertion Subtable\n stateTable: StateTable(InsertionData),\n insertionActions: new r.Pointer(r.uint32, new UnboundedArray(r.uint16))\n }\n});\n\nlet Subtable = new r.Struct({\n length: r.uint32,\n coverage: r.uint24,\n type: r.uint8,\n subFeatureFlags: r.uint32,\n table: SubtableData,\n padding: new r.Reserved(\n r.uint8,\n /** @param {StructValue} t @returns {number} */\n t => /** @type {number} */ (t.length) - /** @type {number} */ (t._currentOffset)\n )\n});\n\nlet FeatureEntry = new r.Struct({\n featureType: r.uint16,\n featureSetting: r.uint16,\n enableFlags: r.uint32,\n disableFlags: r.uint32\n});\n\nlet MorxChain = new r.Struct({\n defaultFlags: r.uint32,\n chainLength: r.uint32,\n nFeatureEntries: r.uint32,\n nSubtables: r.uint32,\n features: new r.Array(FeatureEntry, 'nFeatureEntries'),\n subtables: new r.Array(Subtable, 'nSubtables')\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.uint16,\n unused: new r.Reserved(r.uint16),\n nChains: r.uint32,\n chains: new r.Array(MorxChain, 'nChains')\n});\n", "import * as r from 'restructure';\nimport { LookupTable } from './aat';\n\nlet OpticalBounds = new r.Struct({\n left: r.int16,\n top: r.int16,\n right: r.int16,\n bottom: r.int16\n});\n\n/** @type {import('restructure').Struct} */\nexport default new r.Struct({\n version: r.fixed32,\n format: r.uint16,\n lookupTable: LookupTable(OpticalBounds)\n});\n", "/** @type {Record<string, import('../../types/fontkit').TableCodec>} */\nlet tables = {};\nexport default tables;\n\n// Required Tables\nimport cmap from './cmap';\nimport head from './head';\nimport hhea from './hhea';\nimport hmtx from './hmtx';\nimport maxp from './maxp';\nimport name from './name';\nimport OS2 from './OS2';\nimport post from './post';\n\ntables.cmap = cmap;\ntables.head = head;\ntables.hhea = hhea;\ntables.hmtx = hmtx;\ntables.maxp = maxp;\ntables.name = name;\ntables['OS/2'] = OS2;\ntables.post = post;\n\n// TrueType Outlines\nimport cvt from './cvt';\nimport fpgm from './fpgm';\nimport loca from './loca';\nimport prep from './prep';\nimport glyf from './glyf';\n\ntables.fpgm = fpgm;\ntables.loca = loca;\ntables.prep = prep;\ntables['cvt '] = cvt;\ntables.glyf = glyf;\n\n// PostScript Outlines\nimport CFFFont from '../cff/CFFFont';\nimport VORG from './VORG';\n\ntables['CFF '] = CFFFont;\ntables['CFF2'] = CFFFont;\ntables.VORG = VORG;\n\n// Bitmap Glyphs\nimport EBLC from './EBLC';\nimport sbix from './sbix';\nimport COLR from './COLR';\nimport CPAL from './CPAL';\n\ntables.EBLC = EBLC;\ntables.CBLC = tables.EBLC;\ntables.sbix = sbix;\ntables.COLR = COLR;\ntables.CPAL = CPAL;\n\n// Advanced OpenType Tables\nimport BASE from './BASE';\nimport GDEF from './GDEF';\nimport GPOS from './GPOS';\nimport GSUB from './GSUB';\nimport JSTF from './JSTF';\n\ntables.BASE = BASE;\ntables.GDEF = GDEF;\ntables.GPOS = GPOS;\ntables.GSUB = GSUB;\ntables.JSTF = JSTF;\n\n// OpenType variations tables\nimport HVAR from './HVAR';\n\ntables.HVAR = HVAR;\n\n// Other OpenType Tables\nimport DSIG from './DSIG';\nimport gasp from './gasp';\nimport hdmx from './hdmx';\nimport kern from './kern';\nimport LTSH from './LTSH';\nimport STAT from './STAT';\nimport PCLT from './PCLT';\nimport VDMX from './VDMX';\nimport vhea from './vhea';\nimport vmtx from './vmtx';\n\ntables.DSIG = DSIG;\ntables.gasp = gasp;\ntables.hdmx = hdmx;\ntables.kern = kern;\ntables.LTSH = LTSH;\ntables.STAT = STAT;\ntables.PCLT = PCLT;\ntables.VDMX = VDMX;\ntables.vhea = vhea;\ntables.vmtx = vmtx;\n\n// Apple Advanced Typography Tables\nimport avar from './avar';\nimport bsln from './bsln';\nimport feat from './feat';\nimport fvar from './fvar';\nimport gvar from './gvar';\nimport just from './just';\nimport morx from './morx';\nimport opbd from './opbd';\n\ntables.avar = avar;\ntables.bsln = bsln;\ntables.feat = feat;\ntables.fvar = fvar;\ntables.gvar = gvar;\ntables.just = just;\ntables.morx = morx;\ntables.opbd = opbd;\n", "import * as r from 'restructure';\nimport Tables from './';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('../../types/fontkit').TableEntry} TableEntry */\n/** @typedef {import('../../types/fontkit').TableCodec} TableCodec */\n\n/**\n * @typedef {StructValue & {\n * tag: string,\n * numTables: number,\n * searchRange: number,\n * entrySelector: number,\n * rangeShift: number,\n * tables: TableEntry[] | Record<string, TableEntry>\n * }} DirectoryValue\n */\n\nlet TableEntryStruct = new r.Struct({\n tag: new r.String(4),\n checkSum: r.uint32,\n offset: new r.Pointer(r.uint32, 'void', { type: 'global' }),\n length: r.uint32\n});\n\n/** @type {import('restructure').Struct} */\nlet Directory = new r.Struct({\n tag: new r.String(4),\n numTables: r.uint16,\n searchRange: r.uint16,\n entrySelector: r.uint16,\n rangeShift: r.uint16,\n tables: new r.Array(TableEntryStruct, 'numTables')\n});\n\nDirectory.process = function () {\n let self = /** @type {DirectoryValue} */ (this);\n /** @type {Record<string, TableEntry>} */\n let tables = {};\n for (let table of /** @type {TableEntry[]} */ (self.tables)) {\n tables[table.tag] = table;\n }\n\n self.tables = tables;\n};\n\nDirectory.preEncode = function () {\n let self = /** @type {DirectoryValue} */ (this);\n if (!Array.isArray(self.tables)) {\n /** @type {TableEntry[]} */\n let tables = [];\n /** @type {Record<string, TableEntry>} */\n let byTag = self.tables;\n for (let tag of Object.keys(byTag)) {\n let table = byTag[tag];\n if (table) {\n let codec = /** @type {TableCodec | undefined} */ (Tables[tag]);\n if (!codec || typeof codec.size !== 'function') {\n throw new Error(`Missing encoder for table \"${tag}\"`);\n }\n tables.push({\n tag: tag,\n checkSum: 0,\n offset: /** @type {number} */ (/** @type {unknown} */ (\n new r.VoidPointer(/** @type {import('restructure').BaseType} */ (/** @type {unknown} */ (codec)), table)\n )),\n length: codec.size(table)\n });\n }\n }\n\n self.tables = tables;\n }\n\n self.tag = 'true';\n self.numTables = self.tables.length;\n\n let maxExponentFor2 = Math.floor((Math.log(self.numTables) / Math.LN2));\n let maxPowerOf2 = Math.pow(2, maxExponentFor2);\n\n self.searchRange = maxPowerOf2 * 16;\n self.entrySelector = Math.log(maxPowerOf2) / Math.LN2;\n self.rangeShift = self.numTables * 16 - self.searchRange;\n};\n\nexport default Directory;\n", "/**\n * @template T\n * @param {T[]} arr\n * @param {(item: T) => number} cmp\n * @returns {number}\n */\nexport function binarySearch(arr, cmp) {\n let min = 0;\n let max = arr.length - 1;\n while (min <= max) {\n let mid = (min + max) >> 1;\n let res = cmp(arr[mid]);\n\n if (res < 0) {\n max = mid - 1;\n } else if (res > 0) {\n min = mid + 1;\n } else {\n return mid;\n }\n }\n\n return -1;\n}\n\n/**\n * @param {number} index\n * @param {number} end\n * @returns {number[]}\n */\nexport function range(index, end) {\n let range = [];\n while (index < end) {\n range.push(index++);\n }\n return range;\n}\n\nexport const asciiDecoder = new TextDecoder('ascii');\n\n// Based on https://github.com/niklasvh/base64-arraybuffer. MIT license.\nconst CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst LOOKUP = new Uint8Array(256);\nfor (let i = 0; i < CHARS.length; i++) {\n LOOKUP[CHARS.charCodeAt(i)] = i;\n}\n\n/**\n * @param {string} base64\n * @returns {Uint8Array}\n */\nexport function decodeBase64(base64) {\n let bufferLength = base64.length * 0.75;\n\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n let bytes = new Uint8Array(bufferLength);\n let p = 0;\n\n for (let i = 0, len = base64.length; i < len; i += 4) {\n let encoded1 = LOOKUP[base64.charCodeAt(i)];\n let encoded2 = LOOKUP[base64.charCodeAt(i + 1)];\n let encoded3 = LOOKUP[base64.charCodeAt(i + 2)];\n let encoded4 = LOOKUP[base64.charCodeAt(i + 3)];\n\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n\n return bytes;\n}\n", "import { binarySearch } from './utils';\nimport { getEncoding, getEncodingMapping } from './encodings';\nimport { cache } from './decorators';\nimport { range } from './utils';\n\n/** @typedef {import('../types/fontkit').CmapTable} CmapTable */\n/** @typedef {import('../types/fontkit').CmapSubtable} CmapSubtable */\n/** @typedef {import('../types/fontkit').CmapSubtable14} CmapSubtable14 */\n/** @typedef {import('../types/fontkit').CmapGroup} CmapGroup */\n/** @typedef {import('../types/fontkit').CmapVarSelector} CmapVarSelector */\n\nexport default class CmapProcessor {\n /**\n * @param {CmapTable} cmapTable\n */\n constructor(cmapTable) {\n // Attempt to find a Unicode cmap first\n /** @type {Map<number, number> | null} */\n this.encoding = null;\n this.cmap = this.findSubtable(cmapTable, [\n // 32-bit subtables\n [3, 10],\n [0, 6],\n [0, 4],\n\n // 16-bit subtables\n [3, 1],\n [0, 3],\n [0, 2],\n [0, 1],\n [0, 0]\n ]);\n\n // If not unicode cmap was found, take the first table with a supported encoding.\n if (!this.cmap) {\n for (let cmap of cmapTable.tables) {\n let language\n = 'language' in cmap.table && typeof cmap.table.language === 'number'\n ? cmap.table.language - 1\n : 0;\n let encoding = getEncoding(cmap.platformID, cmap.encodingID, language);\n if (!encoding) {\n continue;\n }\n let mapping = getEncodingMapping(encoding);\n if (mapping) {\n this.cmap = cmap.table;\n this.encoding = mapping;\n }\n }\n }\n\n if (!this.cmap) {\n throw new Error('Could not find a supported cmap table');\n }\n\n let uvs = this.findSubtable(cmapTable, [[0, 5]]);\n /** @type {CmapSubtable14 | null} */\n this.uvs = uvs && uvs.version === 14 ? /** @type {CmapSubtable14} */ (uvs) : null;\n }\n\n /**\n * @param {CmapTable} cmapTable\n * @param {Array<[number, number]>} pairs\n * @returns {CmapSubtable | null}\n */\n findSubtable(cmapTable, pairs) {\n for (let [platformID, encodingID] of pairs) {\n for (let cmap of cmapTable.tables) {\n if (cmap.platformID === platformID && cmap.encodingID === encodingID) {\n return cmap.table;\n }\n }\n }\n\n return null;\n }\n\n /**\n * @param {number} codepoint\n * @param {number} [variationSelector]\n * @returns {number}\n */\n lookup(codepoint, variationSelector) {\n // If there is no Unicode cmap in this font, we need to re-encode\n // the codepoint in the encoding that the cmap supports.\n if (this.encoding) {\n codepoint = this.encoding.get(codepoint) || codepoint;\n\n // Otherwise, try to get a Unicode variation selector for this codepoint if one is provided.\n } else if (variationSelector) {\n let gid = this.getVariationSelector(codepoint, variationSelector);\n if (gid) {\n return gid;\n }\n }\n\n let cmap = this.cmap;\n switch (cmap.version) {\n case 0:\n return cmap.codeMap.get(codepoint) || 0;\n\n case 4: {\n let min = 0;\n let max = cmap.segCount - 1;\n while (min <= max) {\n let mid = (min + max) >> 1;\n\n if (codepoint < /** @type {number} */ (cmap.startCode.get(mid))) {\n max = mid - 1;\n } else if (codepoint > /** @type {number} */ (cmap.endCode.get(mid))) {\n min = mid + 1;\n } else {\n let rangeOffset = /** @type {number} */ (cmap.idRangeOffset.get(mid));\n let gid;\n\n if (rangeOffset === 0) {\n gid = codepoint + /** @type {number} */ (cmap.idDelta.get(mid));\n } else {\n let index = rangeOffset / 2 + (codepoint - /** @type {number} */ (cmap.startCode.get(mid))) - (cmap.segCount - mid);\n gid = cmap.glyphIndexArray.get(index) || 0;\n if (gid !== 0) {\n gid += /** @type {number} */ (cmap.idDelta.get(mid));\n }\n }\n\n return gid & 0xffff;\n }\n }\n\n return 0;\n }\n\n case 8:\n throw new Error('TODO: cmap format 8');\n\n case 6:\n case 10:\n return cmap.glyphIndices.get(codepoint - cmap.firstCode) || 0;\n\n case 12:\n case 13: {\n let min = 0;\n let max = cmap.nGroups - 1;\n while (min <= max) {\n let mid = (min + max) >> 1;\n let group = /** @type {CmapGroup} */ (cmap.groups.get(mid));\n\n if (codepoint < group.startCharCode) {\n max = mid - 1;\n } else if (codepoint > group.endCharCode) {\n min = mid + 1;\n } else {\n if (cmap.version === 12) {\n return group.glyphID + (codepoint - group.startCharCode);\n } else {\n return group.glyphID;\n }\n }\n }\n\n return 0;\n }\n\n case 14:\n throw new Error('TODO: cmap format 14');\n\n default:\n throw new Error(`Unknown cmap format ${/** @type {{ version: number }} */ (cmap).version}`);\n }\n }\n\n /**\n * @param {number} codepoint\n * @param {number} variationSelector\n * @returns {number}\n */\n getVariationSelector(codepoint, variationSelector) {\n if (!this.uvs) {\n return 0;\n }\n\n let selectors = this.uvs.varSelectors.toArray();\n let i = binarySearch(selectors, x => variationSelector - x.varSelector);\n if (i === -1) {\n return 0;\n }\n\n let sel = /** @type {CmapVarSelector} */ (selectors[i]);\n let { defaultUVS, nonDefaultUVS } = sel;\n\n // Default UVS: fall back to the base character's normal cmap glyph.\n if (defaultUVS && binarySearch(defaultUVS, x =>\n codepoint < x.startUnicodeValue ? -1 : codepoint > x.startUnicodeValue + x.additionalCount ? 1 : 0\n ) !== -1) return 0;\n\n if (!nonDefaultUVS) return 0;\n\n let ni = binarySearch(nonDefaultUVS, x => codepoint - x.unicodeValue);\n return ni !== -1 ? nonDefaultUVS[ni].glyphID : 0;\n }\n\n /**\n * @returns {number[]}\n */\n @cache\n getCharacterSet() {\n let cmap = this.cmap;\n switch (cmap.version) {\n case 0:\n return range(0, cmap.codeMap.length);\n\n case 4: {\n let res = [];\n let endCodes = cmap.endCode.toArray();\n for (let i = 0; i < endCodes.length; i++) {\n let tail = endCodes[i] + 1;\n let start = /** @type {number} */ (cmap.startCode.get(i));\n res.push(...range(start, tail));\n }\n\n return res;\n }\n\n case 8:\n throw new Error('TODO: cmap format 8');\n\n case 6:\n case 10:\n return range(cmap.firstCode, cmap.firstCode + cmap.glyphIndices.length);\n\n case 12:\n case 13: {\n let res = [];\n for (let group of cmap.groups.toArray()) {\n res.push(...range(group.startCharCode, group.endCharCode + 1));\n }\n\n return res;\n }\n\n case 14:\n throw new Error('TODO: cmap format 14');\n\n default:\n throw new Error(`Unknown cmap format ${/** @type {{ version: number }} */ (cmap).version}`);\n }\n }\n\n /**\n * @param {number} gid\n * @returns {number[]}\n */\n @cache\n codePointsForGlyph(gid) {\n let cmap = this.cmap;\n switch (cmap.version) {\n case 0: {\n let res = [];\n for (let i = 0; i < 256; i++) {\n if (cmap.codeMap.get(i) === gid) {\n res.push(i);\n }\n }\n\n return res;\n }\n\n case 4: {\n let res = [];\n for (let i = 0; i < cmap.segCount; i++) {\n let end = /** @type {number} */ (cmap.endCode.get(i));\n let start = /** @type {number} */ (cmap.startCode.get(i));\n let rangeOffset = /** @type {number} */ (cmap.idRangeOffset.get(i));\n let delta = /** @type {number} */ (cmap.idDelta.get(i));\n\n for (var c = start; c <= end; c++) {\n let g;\n if (rangeOffset === 0) {\n g = c + delta;\n } else {\n let index = rangeOffset / 2 + (c - start) - (cmap.segCount - i);\n g = cmap.glyphIndexArray.get(index) || 0;\n if (g !== 0) {\n g += delta;\n }\n }\n\n if ((g & 0xffff) === gid) {\n res.push(c);\n }\n }\n }\n\n return res;\n }\n\n case 12: {\n let res = [];\n for (let group of cmap.groups.toArray()) {\n if (gid >= group.glyphID && gid <= group.glyphID + (group.endCharCode - group.startCharCode)) {\n res.push(group.startCharCode + (gid - group.glyphID));\n }\n }\n\n return res;\n }\n\n case 13: {\n let res = [];\n for (let group of cmap.groups.toArray()) {\n if (gid === group.glyphID) {\n res.push(...range(group.startCharCode, group.endCharCode + 1));\n }\n }\n\n return res;\n }\n\n default:\n throw new Error(`Unknown cmap format ${cmap.version}`);\n }\n }\n}\n", "import { binarySearch } from '../utils';\n\n/** @typedef {import('../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../types/fontkit').KernTable} KernTable */\n/** @typedef {import('../../types/fontkit').KernPair} KernPair */\n/** @typedef {import('../../types/fontkit').KernFormat0} KernFormat0 */\n/** @typedef {import('../../types/fontkit').KernFormat2} KernFormat2 */\n/** @typedef {import('../../types/fontkit').KernFormat3} KernFormat3 */\n/** @typedef {import('../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n/** @typedef {import('../../types/fontkit').LayoutGlyph} LayoutGlyph */\n/** @typedef {import('../../types/fontkit').GlyphPositionLike} GlyphPositionLike */\n\n/**\n * @param {unknown} s\n * @returns {s is KernFormat0}\n */\nfunction isKernFormat0(s) {\n return typeof s === 'object' && s !== null && Array.isArray(/** @type {{ pairs?: unknown }} */ (s).pairs);\n}\n\n/**\n * @param {unknown} s\n * @returns {s is KernFormat2}\n */\nfunction isKernFormat2(s) {\n return typeof s === 'object' && s !== null\n && 'leftTable' in s && 'rightTable' in s && 'array' in s;\n}\n\n/**\n * @param {unknown} s\n * @returns {s is KernFormat3}\n */\nfunction isKernFormat3(s) {\n return typeof s === 'object' && s !== null\n && 'glyphCount' in s && 'kernValue' in s && 'kernIndex' in s;\n}\n\nexport default class KernProcessor {\n /**\n * @param {LayoutFont} font\n */\n constructor(font) {\n /** @type {KernTable} */\n this.kern = /** @type {KernTable} */ (font.kern);\n }\n\n /**\n * @param {Array<LayoutGlyph | GlyphInfoLike>} glyphs\n * @param {GlyphPositionLike[]} positions\n */\n process(glyphs, positions) {\n for (let glyphIndex = 0; glyphIndex < glyphs.length - 1; glyphIndex++) {\n let left = glyphs[glyphIndex].id;\n let right = glyphs[glyphIndex + 1].id;\n positions[glyphIndex].xAdvance += this.getKerning(left, right);\n }\n }\n\n /**\n * @param {number} left\n * @param {number} right\n * @returns {number}\n */\n getKerning(left, right) {\n let res = 0;\n\n for (let table of this.kern.tables) {\n if (table.coverage.crossStream) {\n continue;\n }\n\n switch (table.version) {\n case 0:\n if (!table.coverage.horizontal) {\n continue;\n }\n\n break;\n case 1:\n if (table.coverage.vertical || table.coverage.variation) {\n continue;\n }\n\n break;\n default:\n throw new Error(`Unsupported kerning table version ${table.version}`);\n }\n\n let val = 0;\n let s = table.subtable;\n switch (table.format) {\n case 0: {\n if (!isKernFormat0(s)) {\n break;\n }\n let pairIdx = binarySearch(s.pairs, /** @param {KernPair} pair */ (pair) => {\n return (left - pair.left) || (right - pair.right);\n });\n\n if (pairIdx >= 0) {\n val = s.pairs[pairIdx].value;\n }\n\n break;\n }\n\n case 2: {\n if (!isKernFormat2(s)) {\n break;\n }\n let leftOffset = 0;\n let rightOffset = 0;\n if (left >= s.leftTable.firstGlyph && left < s.leftTable.firstGlyph + s.leftTable.nGlyphs) {\n leftOffset = s.leftTable.offsets[left - s.leftTable.firstGlyph];\n } else {\n leftOffset = s.array.off;\n }\n\n if (right >= s.rightTable.firstGlyph && right < s.rightTable.firstGlyph + s.rightTable.nGlyphs) {\n rightOffset = s.rightTable.offsets[right - s.rightTable.firstGlyph];\n }\n\n let index = (leftOffset + rightOffset - s.array.off) / 2;\n val = s.array.values.get(index);\n break;\n }\n\n case 3: {\n if (!isKernFormat3(s)) {\n break;\n }\n if (left >= s.glyphCount || right >= s.glyphCount) {\n return 0;\n }\n\n val = s.kernValue[s.kernIndex[s.leftClass[left] * s.rightClassCount + s.rightClass[right]]];\n break;\n }\n\n default:\n throw new Error(`Unsupported kerning sub-table format ${table.format}`);\n }\n\n // Microsoft supports the override flag, which resets the result\n // Otherwise, the sum of the results from all subtables is returned\n if (table.coverage.override) {\n res = val;\n } else {\n res += val;\n }\n }\n\n return res;\n }\n}\n", "// DEFLATE is a complex format; to read this code, you should probably check the RFC first:\n// https://tools.ietf.org/html/rfc1951\n// You may also wish to take a look at the guide I made about this program:\n// https://gist.github.com/101arrowz/253f31eb5abc3d9275ab943003ffecad\n// Some of the following code is similar to that of UZIP.js:\n// https://github.com/photopea/UZIP.js\n// However, the vast majority of the codebase has diverged from UZIP.js to increase performance and reduce bundle size.\n// Sometimes 0 will appear where -1 would be more appropriate. This is because using a uint\n// is better for memory in most engines (I *think*).\nvar ch2 = {};\nvar wk = (function (c, id, msg, transfer, cb) {\n var w = new Worker(ch2[id] || (ch2[id] = URL.createObjectURL(new Blob([\n c + ';addEventListener(\"error\",function(e){e=e.error;postMessage({$e$:[e.message,e.code,e.stack]})})'\n ], { type: 'text/javascript' }))));\n w.onmessage = function (e) {\n var d = e.data, ed = d.$e$;\n if (ed) {\n var err = new Error(ed[0]);\n err['code'] = ed[1];\n err.stack = ed[2];\n cb(err, null);\n }\n else\n cb(null, d);\n };\n w.postMessage(msg, transfer);\n return w;\n});\n\n// aliases for shorter compressed code (most minifers don't do this)\nvar u8 = Uint8Array, u16 = Uint16Array, i32 = Int32Array;\n// fixed length extra bits\nvar fleb = new u8([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, /* unused */ 0, 0, /* impossible */ 0]);\n// fixed distance extra bits\nvar fdeb = new u8([0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, /* unused */ 0, 0]);\n// code length index map\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\n// get base, reverse index map from extra bits\nvar freb = function (eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n // numbers here are at max 18 bits\n var r = new i32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = ((j - b[i]) << 5) | i;\n }\n }\n return { b: b, r: r };\n};\nvar _a = freb(fleb, 2), fl = _a.b, revfl = _a.r;\n// we can ignore the fact that the other numbers are wrong; they never happen anyway\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b.b, revfd = _b.r;\n// map of value to reverse (assuming 16 bits)\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n // reverse table algorithm from SO\n var x = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);\n x = ((x & 0xCCCC) >> 2) | ((x & 0x3333) << 2);\n x = ((x & 0xF0F0) >> 4) | ((x & 0x0F0F) << 4);\n rev[i] = (((x & 0xFF00) >> 8) | ((x & 0x00FF) << 8)) >> 1;\n}\n// create huffman tree from u8 \"map\": index -> code length for code index\n// mb (max bits) must be at most 15\n// TODO: optimize/split up?\nvar hMap = (function (cd, mb, r) {\n var s = cd.length;\n // index\n var i = 0;\n // u16 \"map\": index -> # of codes with bit length = index\n var l = new u16(mb);\n // length of cd must be 288 (total # of codes)\n for (; i < s; ++i) {\n if (cd[i])\n ++l[cd[i] - 1];\n }\n // u16 \"map\": index -> minimum code for bit length = index\n var le = new u16(mb);\n for (i = 1; i < mb; ++i) {\n le[i] = (le[i - 1] + l[i - 1]) << 1;\n }\n var co;\n if (r) {\n // u16 \"map\": index -> number of actual bits, symbol for code\n co = new u16(1 << mb);\n // bits to remove for reverser\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n // ignore 0 lengths\n if (cd[i]) {\n // num encoding both symbol and bits read\n var sv = (i << 4) | cd[i];\n // free bits\n var r_1 = mb - cd[i];\n // start value\n var v = le[cd[i] - 1]++ << r_1;\n // m is end value\n for (var m = v | ((1 << r_1) - 1); v <= m; ++v) {\n // every 16 bit value starting with the code yields the same result\n co[rev[v] >> rvb] = sv;\n }\n }\n }\n }\n else {\n co = new u16(s);\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n co[i] = rev[le[cd[i] - 1]++] >> (15 - cd[i]);\n }\n }\n }\n return co;\n});\n// fixed length tree\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\n// fixed distance tree\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\n// fixed length map\nvar flm = /*#__PURE__*/ hMap(flt, 9, 0), flrm = /*#__PURE__*/ hMap(flt, 9, 1);\n// fixed distance map\nvar fdm = /*#__PURE__*/ hMap(fdt, 5, 0), fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);\n// find max of array\nvar max = function (a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\n// read d, starting at bit p and mask with m\nvar bits = function (d, p, m) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8)) >> (p & 7)) & m;\n};\n// read d, starting at bit p continuing for at least 16 bits\nvar bits16 = function (d, p) {\n var o = (p / 8) | 0;\n return ((d[o] | (d[o + 1] << 8) | (d[o + 2] << 16)) >> (p & 7));\n};\n// get end of byte\nvar shft = function (p) { return ((p + 7) / 8) | 0; };\n// typed array slice - allows garbage collector to free original reference,\n// while being more compatible than .slice\nvar slc = function (v, s, e) {\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n // can't use .constructor in case user-supplied\n return new u8(v.subarray(s, e));\n};\n/**\n * Codes for errors generated within this library\n */\nexport var FlateErrorCode = {\n UnexpectedEOF: 0,\n InvalidBlockType: 1,\n InvalidLengthLiteral: 2,\n InvalidDistance: 3,\n StreamFinished: 4,\n NoStreamHandler: 5,\n InvalidHeader: 6,\n NoCallback: 7,\n InvalidUTF8: 8,\n ExtraFieldTooLong: 9,\n InvalidDate: 10,\n FilenameTooLong: 11,\n StreamFinishing: 12,\n InvalidZipData: 13,\n UnknownCompressionMethod: 14\n};\n// error codes\nvar ec = [\n 'unexpected EOF',\n 'invalid block type',\n 'invalid length/literal',\n 'invalid distance',\n 'stream finished',\n 'no stream handler',\n , // determined by compression function\n 'no callback',\n 'invalid UTF-8 data',\n 'extra field too long',\n 'date not in range 1980-2099',\n 'filename too long',\n 'stream finishing',\n 'invalid zip data'\n // determined by unknown compression method\n];\n;\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\n// expands raw DEFLATE data\nvar inflt = function (dat, st, buf, dict) {\n // source length dict length\n var sl = dat.length, dl = dict ? dict.length : 0;\n if (!sl || st.f && !st.l)\n return buf || new u8(0);\n var noBuf = !buf;\n // have to estimate size\n var resize = noBuf || st.i != 2;\n // no state\n var noSt = st.i;\n // Assumes roughly 33% compression ratio average\n if (noBuf)\n buf = new u8(sl * 3);\n // ensure buffer can fit at least l elements\n var cbuf = function (l) {\n var bl = buf.length;\n // need to increase size to fit\n if (l > bl) {\n // Double or set to necessary, whichever is greater\n var nbuf = new u8(Math.max(bl * 2, l));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n // last chunk bitpos bytes\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n // total bits\n var tbts = sl * 8;\n do {\n if (!lm) {\n // BFINAL - this is only 1 when last chunk is next\n final = bits(dat, pos, 1);\n // type: 0 = no compression, 1 = fixed huffman, 2 = dynamic huffman\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n // go to end of byte boundary\n var s = shft(pos) + 4, l = dat[s - 4] | (dat[s - 3] << 8), t = s + l;\n if (t > sl) {\n if (noSt)\n err(0);\n break;\n }\n // ensure size\n if (resize)\n cbuf(bt + l);\n // Copy over uncompressed data\n buf.set(dat.subarray(s, t), bt);\n // Get new bitpos, update byte count\n st.b = bt += l, st.p = pos = t * 8, st.f = final;\n continue;\n }\n else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n // literal lengths\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n // length+distance tree\n var ldt = new u8(tl);\n // code length tree\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n // use index map to get real code\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n // code lengths bits\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n // code lengths map\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl;) {\n var r = clm[bits(dat, pos, clbmsk)];\n // bits read\n pos += r & 15;\n // symbol\n var s = r >> 4;\n // code length to copy\n if (s < 16) {\n ldt[i++] = s;\n }\n else {\n // copy count\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n // length tree distance tree\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n // max length bits\n lbt = max(lt);\n // max dist bits\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n }\n else\n err(1);\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n }\n // Make sure the buffer can hold this + the largest possible addition\n // Maximum chunk size (practically, theoretically infinite) is 2^17\n if (resize)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var lpos = pos;\n for (;; lpos = pos) {\n // bits read, code\n var c = lm[bits16(dat, pos) & lms], sym = c >> 4;\n pos += c & 15;\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (!c)\n err(2);\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lpos = pos, lm = null;\n break;\n }\n else {\n var add = sym - 254;\n // no extra bits needed if less\n if (sym > 264) {\n // index\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n // dist\n var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;\n if (!d)\n err(3);\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts) {\n if (noSt)\n err(0);\n break;\n }\n if (resize)\n cbuf(bt + 131072);\n var end = bt + add;\n if (bt < dt) {\n var shift = dl - dt, dend = Math.min(dt, end);\n if (shift + bt < 0)\n err(3);\n for (; bt < dend; ++bt)\n buf[bt] = dict[shift + bt];\n }\n for (; bt < end; ++bt)\n buf[bt] = buf[bt - dt];\n }\n }\n st.l = lm, st.p = lpos, st.b = bt, st.f = final;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n // don't reallocate for streams or user buffers\n return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);\n};\n// starting at p, write the minimum number of bits that can hold v to d\nvar wbits = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n};\n// starting at p, write the minimum number of bits (>8) that can hold v to d\nvar wbits16 = function (d, p, v) {\n v <<= p & 7;\n var o = (p / 8) | 0;\n d[o] |= v;\n d[o + 1] |= v >> 8;\n d[o + 2] |= v >> 16;\n};\n// creates code lengths from a frequency table\nvar hTree = function (d, mb) {\n // Need extra info to make a tree\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return { t: et, l: 0 };\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return { t: v, l: 1 };\n }\n t.sort(function (a, b) { return a.f - b.f; });\n // after i2 reaches last ind, will be stopped\n // freq must be greater than largest possible number of symbols\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l: l, r: r };\n // efficient algorithm from UZIP.js\n // i0 is lookbehind, i2 is lookahead - after processing two low-freq\n // symbols that combined have high freq, will start processing i2 (high-freq,\n // non-composite) symbols instead\n // see https://reddit.com/r/photopea/comments/ikekht/uzipjs_questions/\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l: l, r: r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n // code lengths\n var tr = new u16(maxSym + 1);\n // max bits in tree\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n // more algorithms from UZIP.js\n // TODO: find out how this code works (debt)\n // ind debt\n var i = 0, dt = 0;\n // left cost\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function (a, b) { return tr[b.s] - tr[a.s] || a.f - b.f; });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << (mbt - tr[i2_1]));\n tr[i2_1] = mb;\n }\n else\n break;\n }\n dt >>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << (mb - tr[i2_2]++ - 1);\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return { t: new u8(tr), l: mbt };\n};\n// get the max length and assign length codes\nvar ln = function (n, l, d) {\n return n.s == -1\n ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1))\n : (l[n.s] = d);\n};\n// length codes generation\nvar lc = function (c) {\n var s = c.length;\n // Note that the semicolon was intentional\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n // ind num streak\n var cli = 0, cln = c[0], cls = 1;\n var w = function (v) { cl[cli++] = v; };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? ((cls - 11) << 5) | 28690 : ((cls - 3) << 5) | 12305);\n cls = 0;\n }\n }\n else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(((cls - 3) << 5) | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return { c: cl.subarray(0, cli), n: s };\n};\n// calculate the length of output from tree, code lengths\nvar clen = function (cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\n// writes a fixed block\n// returns the new bit pos\nvar wfblk = function (out, pos, dat) {\n // no need to write 00 as type: TypedArray defaults to 0\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\n// writes a block\nvar wblk = function (dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a = hTree(lf, 15), dlt = _a.t, mlb = _a.l;\n var _b = hTree(df, 15), ddt = _b.t, mdb = _b.l;\n var _c = lc(dlt), lclt = _c.c, nlc = _c.n;\n var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n ++lcfreq[lclt[i] & 31];\n for (var i = 0; i < lcdt.length; ++i)\n ++lcfreq[lcdt[i] & 31];\n var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = (bl + 5) << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];\n if (bs >= 0 && flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, (clct[i] >> 5) & 127), p += clct[i] >> 12;\n }\n }\n }\n else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n var sym = syms[i];\n if (sym > 255) {\n var len = (sym >> 18) & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, (sym >> 23) & 31), p += fleb[len];\n var dst = sym & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, (sym >> 5) & 8191), p += fdeb[dst];\n }\n else {\n wbits16(out, p, lm[sym]), p += ll[sym];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\n// deflate options (nice << 13) | chain\nvar deo = /*#__PURE__*/ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\n// empty\nvar et = /*#__PURE__*/ new u8(0);\n// compresses data into a raw DEFLATE buffer\nvar dflt = function (dat, lvl, plvl, pre, post, st) {\n var s = st.z || dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7000)) + post);\n // writing to this writes to the output buffer\n var w = o.subarray(pre, o.length - post);\n var lst = st.l;\n var pos = (st.r || 0) & 7;\n if (lvl) {\n if (pos)\n w[0] = st.r >> 3;\n var opt = deo[lvl - 1];\n var n = opt >> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n // prev 2-byte val map curr 2-byte val map\n var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function (i) { return (dat[i] ^ (dat[i + 1] << bs1_1) ^ (dat[i + 2] << bs2_1)) & msk_1; };\n // 24576 is an arbitrary number of maximum symbols per block\n // 424 buffer for last block\n var syms = new i32(25000);\n // length/literal freq distance freq\n var lf = new u16(288), df = new u16(32);\n // l/lcnt exbits index l/lind waitdx blkpos\n var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;\n for (; i + 2 < s; ++i) {\n // hash value\n var hv = hsh(i);\n // index mod 32768 previous index mod\n var imod = i & 32767, pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n // We always should modify head and prev, but only add symbols if\n // this data is not yet processed (\"wait\" for wait index)\n if (wi <= i) {\n // bytes remaining\n var rem = s - i;\n if ((lc_1 > 7000 || li > 24576) && (rem > 423 || !lst)) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n // len dist chain\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n // max possible length\n // not capped at dif because decompressors implement \"rolling\" index population\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n // break out early when we reach \"nice\" (we are satisfied enough)\n if (nl > maxn)\n break;\n // now, find the rarest 2-byte sequence within this\n // length of literals and search for that instead.\n // Much faster than just using the start\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j & 32767;\n var pti = prev[ti];\n var cd = ti - pti & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n // check the previous match\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod & 32767;\n }\n }\n // d will be nonzero only when a match was found\n if (d) {\n // store both dist and len data in one int32\n // Make sure this is recognized as a len/dist with 28th bit (2^28)\n syms[li++] = 268435456 | (revfl[l] << 18) | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n }\n else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n for (i = Math.max(i, wi); i < s; ++i) {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n if (!lst) {\n st.r = (pos & 7) | w[(pos / 8) | 0] << 3;\n // shft(pos) now 1 less if pos & 7 != 0\n pos -= 7;\n st.h = head, st.p = prev, st.i = i, st.w = wi;\n }\n }\n else {\n for (var i = st.w || 0; i < s + lst; i += 65535) {\n // end\n var e = i + 65535;\n if (e >= s) {\n // write final block\n w[(pos / 8) | 0] = lst;\n e = s;\n }\n pos = wfblk(w, pos + 1, dat.subarray(i, e));\n }\n st.i = s;\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\n// CRC32 table\nvar crct = /*#__PURE__*/ (function () {\n var t = new Int32Array(256);\n for (var i = 0; i < 256; ++i) {\n var c = i, k = 9;\n while (--k)\n c = ((c & 1) && -306674912) ^ (c >>> 1);\n t[i] = c;\n }\n return t;\n})();\n// CRC32\nvar crc = function () {\n var c = -1;\n return {\n p: function (d) {\n // closures have awful performance\n var cr = c;\n for (var i = 0; i < d.length; ++i)\n cr = crct[(cr & 255) ^ d[i]] ^ (cr >>> 8);\n c = cr;\n },\n d: function () { return ~c; }\n };\n};\n// Adler32\nvar adler = function () {\n var a = 1, b = 0;\n return {\n p: function (d) {\n // closures have awful performance\n var n = a, m = b;\n var l = d.length | 0;\n for (var i = 0; i != l;) {\n var e = Math.min(i + 2655, l);\n for (; i < e; ++i)\n m += n += d[i];\n n = (n & 65535) + 15 * (n >> 16), m = (m & 65535) + 15 * (m >> 16);\n }\n a = n, b = m;\n },\n d: function () {\n a %= 65521, b %= 65521;\n return (a & 255) << 24 | (a & 0xFF00) << 8 | (b & 255) << 8 | (b >> 8);\n }\n };\n};\n;\n// deflate with opts\nvar dopt = function (dat, opt, pre, post, st) {\n if (!st) {\n st = { l: 1 };\n if (opt.dictionary) {\n var dict = opt.dictionary.subarray(-32768);\n var newDat = new u8(dict.length + dat.length);\n newDat.set(dict);\n newDat.set(dat, dict.length);\n dat = newDat;\n st.w = dict.length;\n }\n }\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? (st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20) : (12 + opt.mem), pre, post, st);\n};\n// Walmart object spread\nvar mrg = function (a, b) {\n var o = {};\n for (var k in a)\n o[k] = a[k];\n for (var k in b)\n o[k] = b[k];\n return o;\n};\n// worker clone\n// This is possibly the craziest part of the entire codebase, despite how simple it may seem.\n// The only parameter to this function is a closure that returns an array of variables outside of the function scope.\n// We're going to try to figure out the variable names used in the closure as strings because that is crucial for workerization.\n// We will return an object mapping of true variable name to value (basically, the current scope as a JS object).\n// The reason we can't just use the original variable names is minifiers mangling the toplevel scope.\n// This took me three weeks to figure out how to do.\nvar wcln = function (fn, fnStr, td) {\n var dt = fn();\n var st = fn.toString();\n var ks = st.slice(st.indexOf('[') + 1, st.lastIndexOf(']')).replace(/\\s+/g, '').split(',');\n for (var i = 0; i < dt.length; ++i) {\n var v = dt[i], k = ks[i];\n if (typeof v == 'function') {\n fnStr += ';' + k + '=';\n var st_1 = v.toString();\n if (v.prototype) {\n // for global objects\n if (st_1.indexOf('[native code]') != -1) {\n var spInd = st_1.indexOf(' ', 8) + 1;\n fnStr += st_1.slice(spInd, st_1.indexOf('(', spInd));\n }\n else {\n fnStr += st_1;\n for (var t in v.prototype)\n fnStr += ';' + k + '.prototype.' + t + '=' + v.prototype[t].toString();\n }\n }\n else\n fnStr += st_1;\n }\n else\n td[k] = v;\n }\n return fnStr;\n};\nvar ch = [];\n// clone bufs\nvar cbfs = function (v) {\n var tl = [];\n for (var k in v) {\n if (v[k].buffer) {\n tl.push((v[k] = new v[k].constructor(v[k])).buffer);\n }\n }\n return tl;\n};\n// use a worker to execute code\nvar wrkr = function (fns, init, id, cb) {\n if (!ch[id]) {\n var fnStr = '', td_1 = {}, m = fns.length - 1;\n for (var i = 0; i < m; ++i)\n fnStr = wcln(fns[i], fnStr, td_1);\n ch[id] = { c: wcln(fns[m], fnStr, td_1), e: td_1 };\n }\n var td = mrg({}, ch[id].e);\n return wk(ch[id].c + ';onmessage=function(e){for(var k in e.data)self[k]=e.data[k];onmessage=' + init.toString() + '}', id, td, cbfs(td), cb);\n};\n// base async inflate fn\nvar bInflt = function () { return [u8, u16, i32, fleb, fdeb, clim, fl, fd, flrm, fdrm, rev, ec, hMap, max, bits, bits16, shft, slc, err, inflt, inflateSync, pbf, gopt]; };\nvar bDflt = function () { return [u8, u16, i32, fleb, fdeb, clim, revfl, revfd, flm, flt, fdm, fdt, rev, deo, et, hMap, wbits, wbits16, hTree, ln, lc, clen, wfblk, wblk, shft, slc, dflt, dopt, deflateSync, pbf]; };\n// gzip extra\nvar gze = function () { return [gzh, gzhl, wbytes, crc, crct]; };\n// gunzip extra\nvar guze = function () { return [gzs, gzl]; };\n// zlib extra\nvar zle = function () { return [zlh, wbytes, adler]; };\n// unzlib extra\nvar zule = function () { return [zls]; };\n// post buf\nvar pbf = function (msg) { return postMessage(msg, [msg.buffer]); };\n// get opts\nvar gopt = function (o) { return o && {\n out: o.size && new u8(o.size),\n dictionary: o.dictionary\n}; };\n// async helper\nvar cbify = function (dat, opts, fns, init, id, cb) {\n var w = wrkr(fns, init, id, function (err, dat) {\n w.terminate();\n cb(err, dat);\n });\n w.postMessage([dat, opts], opts.consume ? [dat.buffer] : []);\n return function () { w.terminate(); };\n};\n// auto stream\nvar astrm = function (strm) {\n strm.ondata = function (dat, final) { return postMessage([dat, final], [dat.buffer]); };\n return function (ev) {\n if (ev.data[0]) {\n strm.push(ev.data[0], ev.data[1]);\n postMessage([ev.data[0].length]);\n }\n else\n strm.flush(ev.data[1]);\n };\n};\n// async stream attach\nvar astrmify = function (fns, strm, opts, init, id, flush, ext) {\n var t;\n var w = wrkr(fns, init, id, function (err, dat) {\n if (err)\n w.terminate(), strm.ondata.call(strm, err);\n else if (!Array.isArray(dat))\n ext(dat);\n else if (dat.length == 1) {\n strm.queuedSize -= dat[0];\n if (strm.ondrain)\n strm.ondrain(dat[0]);\n }\n else {\n if (dat[1])\n w.terminate();\n strm.ondata.call(strm, err, dat[0], dat[1]);\n }\n });\n w.postMessage(opts);\n strm.queuedSize = 0;\n strm.push = function (d, f) {\n if (!strm.ondata)\n err(5);\n if (t)\n strm.ondata(err(4, 0, 1), null, !!f);\n strm.queuedSize += d.length;\n // can fail for cross-realm Uint8Array, but ok - only a small performance penalty\n w.postMessage([d, t = f], d.buffer instanceof ArrayBuffer ? [d.buffer] : []);\n };\n strm.terminate = function () { w.terminate(); };\n if (flush) {\n strm.flush = function (sync) { w.postMessage([0, sync]); };\n }\n};\n// read 2 bytes\nvar b2 = function (d, b) { return d[b] | (d[b + 1] << 8); };\n// read 4 bytes\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read 8 bytes\nvar b8 = function (d, b) { return b4(d, b) + (b4(d, b + 4) * 4294967296); };\n// write bytes\nvar wbytes = function (d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\n// gzip header\nvar gzh = function (c, o) {\n var fn = o.filename;\n c[0] = 31, c[1] = 139, c[2] = 8, c[8] = o.level < 2 ? 4 : o.level == 9 ? 2 : 0, c[9] = 3; // assume Unix\n if (o.mtime != 0)\n wbytes(c, 4, Math.floor(new Date(o.mtime || Date.now()) / 1000));\n if (fn) {\n c[3] = 8;\n for (var i = 0; i <= fn.length; ++i)\n c[i + 10] = fn.charCodeAt(i);\n }\n};\n// gzip footer: -8 to -4 = CRC, -4 to -0 is length\n// gzip start\nvar gzs = function (d) {\n if (d[0] != 31 || d[1] != 139 || d[2] != 8)\n err(6, 'invalid gzip data');\n var flg = d[3];\n var st = 10;\n if (flg & 4)\n st += (d[10] | d[11] << 8) + 2;\n for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++])\n ;\n return st + (flg & 2);\n};\n// gzip length\nvar gzl = function (d) {\n var l = d.length;\n return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;\n};\n// gzip header length\nvar gzhl = function (o) { return 10 + (o.filename ? o.filename.length + 1 : 0); };\n// zlib header\nvar zlh = function (c, o) {\n var lv = o.level, fl = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = (fl << 6) | (o.dictionary && 32);\n c[1] |= 31 - ((c[0] << 8) | c[1]) % 31;\n if (o.dictionary) {\n var h = adler();\n h.p(o.dictionary);\n wbytes(c, 2, h.d());\n }\n};\n// zlib start\nvar zls = function (d, dict) {\n if ((d[0] & 15) != 8 || (d[0] >> 4) > 7 || ((d[0] << 8 | d[1]) % 31))\n err(6, 'invalid zlib data');\n if ((d[1] >> 5 & 1) == +!dict)\n err(6, 'invalid zlib data: ' + (d[1] & 32 ? 'need' : 'unexpected') + ' dictionary');\n return (d[1] >> 3 & 4) + 2;\n};\nfunction StrmOpt(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n return opts;\n}\n/**\n * Streaming DEFLATE compression\n */\nvar Deflate = /*#__PURE__*/ (function () {\n function Deflate(opts, cb) {\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n this.o = opts || {};\n this.s = { l: 0, i: 32768, w: 32768, z: 32768 };\n // Buffer length must always be 0 mod 32768 for index calculations to be correct when modifying head and prev\n // 98304 = 32768 (lookback) + 65536 (common chunk size)\n this.b = new u8(98304);\n if (this.o.dictionary) {\n var dict = this.o.dictionary.subarray(-32768);\n this.b.set(dict, 32768 - dict.length);\n this.s.i = 32768 - dict.length;\n }\n }\n Deflate.prototype.p = function (c, f) {\n this.ondata(dopt(c, this.o, 0, 0, this.s), f);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Deflate.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n var endLen = chunk.length + this.s.z;\n if (endLen > this.b.length) {\n if (endLen > 2 * this.b.length - 32768) {\n var newBuf = new u8(endLen & -32768);\n newBuf.set(this.b.subarray(0, this.s.z));\n this.b = newBuf;\n }\n var split = this.b.length - this.s.z;\n this.b.set(chunk.subarray(0, split), this.s.z);\n this.s.z = this.b.length;\n this.p(this.b, false);\n this.b.set(this.b.subarray(-32768));\n this.b.set(chunk.subarray(split), 32768);\n this.s.z = chunk.length - split + 32768;\n this.s.i = 32766, this.s.w = 32768;\n }\n else {\n this.b.set(chunk, this.s.z);\n this.s.z += chunk.length;\n }\n this.s.l = final & 1;\n if (this.s.z > this.s.w + 8191 || final) {\n this.p(this.b, final || false);\n this.s.w = this.s.i, this.s.i -= 2;\n }\n if (final) {\n // cleanup unneeded buffers/state to reduce memory usage\n this.s = this.o = {};\n this.b = et;\n }\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * deflated output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible. A separate DEFLATE stream may be concatenated\n * with the current output after a sync flush.\n */\n Deflate.prototype.flush = function (sync) {\n if (!this.ondata)\n err(5);\n if (this.s.l)\n err(4);\n this.p(this.b, false);\n this.s.w = this.s.i, this.s.i -= 2;\n // could technically skip writing the type-0 block for (this.s.r & 7) == 0,\n // but the deterministic trailer (00 00 FF FF) is useful in some situations\n if (sync) {\n var c = new u8(6);\n c[0] = this.s.r >> 3;\n // write empty, non-final type-0 block\n var ep = wfblk(c, this.s.r, et);\n this.s.r = 0;\n this.ondata(c.subarray(0, ep >> 3), false);\n }\n };\n return Deflate;\n}());\nexport { Deflate };\n/**\n * Asynchronous streaming DEFLATE compression\n */\nvar AsyncDeflate = /*#__PURE__*/ (function () {\n function AsyncDeflate(opts, cb) {\n astrmify([\n bDflt,\n function () { return [astrm, Deflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Deflate(ev.data);\n onmessage = astrm(strm);\n }, 6, 1);\n }\n return AsyncDeflate;\n}());\nexport { AsyncDeflate };\nexport function deflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n ], function (ev) { return pbf(deflateSync(ev.data[0], ev.data[1])); }, 0, cb);\n}\n/**\n * Compresses data with DEFLATE without any wrapper\n * @param data The data to compress\n * @param opts The compression options\n * @returns The deflated version of the data\n */\nexport function deflateSync(data, opts) {\n return dopt(data, opts || {}, 0, 0);\n}\n/**\n * Streaming DEFLATE decompression\n */\nvar Inflate = /*#__PURE__*/ (function () {\n function Inflate(opts, cb) {\n // no StrmOpt here to avoid adding to workerizer\n if (typeof opts == 'function')\n cb = opts, opts = {};\n this.ondata = cb;\n var dict = opts && opts.dictionary && opts.dictionary.subarray(-32768);\n this.s = { i: 0, b: dict ? dict.length : 0 };\n this.o = new u8(32768);\n this.p = new u8(0);\n if (dict)\n this.o.set(dict);\n }\n Inflate.prototype.e = function (c) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n if (!this.p.length)\n this.p = c;\n else if (c.length) {\n var n = new u8(this.p.length + c.length);\n n.set(this.p), n.set(c, this.p.length), this.p = n;\n }\n };\n Inflate.prototype.c = function (final) {\n this.s.i = +(this.d = final || false);\n var bts = this.s.b;\n var dt = inflt(this.p, this.s, this.o);\n this.ondata(slc(dt, bts, this.s.b), this.d);\n this.o = slc(dt, this.s.b - 32768), this.s.b = this.o.length;\n this.p = slc(this.p, (this.s.p / 8) | 0), this.s.p &= 7;\n };\n /**\n * Pushes a chunk to be inflated\n * @param chunk The chunk to push\n * @param final Whether this is the final chunk\n */\n Inflate.prototype.push = function (chunk, final) {\n this.e(chunk), this.c(final);\n };\n return Inflate;\n}());\nexport { Inflate };\n/**\n * Asynchronous streaming DEFLATE decompression\n */\nvar AsyncInflate = /*#__PURE__*/ (function () {\n function AsyncInflate(opts, cb) {\n astrmify([\n bInflt,\n function () { return [astrm, Inflate]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Inflate(ev.data);\n onmessage = astrm(strm);\n }, 7, 0);\n }\n return AsyncInflate;\n}());\nexport { AsyncInflate };\nexport function inflate(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt\n ], function (ev) { return pbf(inflateSync(ev.data[0], gopt(ev.data[1]))); }, 1, cb);\n}\nexport function inflateSync(data, opts) {\n return inflt(data, { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// before you yell at me for not just using extends, my reason is that TS inheritance is hard to workerize.\n/**\n * Streaming GZIP compression\n */\nvar Gzip = /*#__PURE__*/ (function () {\n function Gzip(opts, cb) {\n this.c = crc();\n this.l = 0;\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gzip.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n this.l += chunk.length;\n Deflate.prototype.push.call(this, chunk, final);\n };\n Gzip.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && gzhl(this.o), f && 8, this.s);\n if (this.v)\n gzh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 8, this.c.d()), wbytes(raw, raw.length - 4, this.l);\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * GZIPped output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Gzip.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Gzip;\n}());\nexport { Gzip };\n/**\n * Asynchronous streaming GZIP compression\n */\nvar AsyncGzip = /*#__PURE__*/ (function () {\n function AsyncGzip(opts, cb) {\n astrmify([\n bDflt,\n gze,\n function () { return [astrm, Deflate, Gzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gzip(ev.data);\n onmessage = astrm(strm);\n }, 8, 1);\n }\n return AsyncGzip;\n}());\nexport { AsyncGzip };\nexport function gzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n gze,\n function () { return [gzipSync]; }\n ], function (ev) { return pbf(gzipSync(ev.data[0], ev.data[1])); }, 2, cb);\n}\n/**\n * Compresses data with GZIP\n * @param data The data to compress\n * @param opts The compression options\n * @returns The gzipped version of the data\n */\nexport function gzipSync(data, opts) {\n if (!opts)\n opts = {};\n var c = crc(), l = data.length;\n c.p(data);\n var d = dopt(data, opts, gzhl(opts), 8), s = d.length;\n return gzh(d, opts), wbytes(d, s - 8, c.d()), wbytes(d, s - 4, l), d;\n}\n/**\n * Streaming single or multi-member GZIP decompression\n */\nvar Gunzip = /*#__PURE__*/ (function () {\n function Gunzip(opts, cb) {\n this.v = 1;\n this.r = 0;\n Inflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be GUNZIPped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Gunzip.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n this.r += chunk.length;\n if (this.v) {\n var p = this.p.subarray(this.v - 1);\n var s = p.length > 3 ? gzs(p) : 4;\n if (s > p.length) {\n if (!final)\n return;\n }\n else if (this.v > 1 && this.onmember) {\n this.onmember(this.r - p.length);\n }\n this.p = p.subarray(s), this.v = 0;\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, 0);\n // process concatenated GZIP\n if (this.s.f && !this.s.l) {\n this.v = shft(this.s.p) + 9;\n this.s = { i: 0 };\n this.o = new u8(0);\n this.push(new u8(0), final);\n }\n else if (final) {\n Inflate.prototype.c.call(this, final);\n }\n };\n return Gunzip;\n}());\nexport { Gunzip };\n/**\n * Asynchronous streaming single or multi-member GZIP decompression\n */\nvar AsyncGunzip = /*#__PURE__*/ (function () {\n function AsyncGunzip(opts, cb) {\n var _this = this;\n astrmify([\n bInflt,\n guze,\n function () { return [astrm, Inflate, Gunzip]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Gunzip(ev.data);\n strm.onmember = function (offset) { return postMessage(offset); };\n onmessage = astrm(strm);\n }, 9, 0, function (offset) { return _this.onmember && _this.onmember(offset); });\n }\n return AsyncGunzip;\n}());\nexport { AsyncGunzip };\nexport function gunzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n guze,\n function () { return [gunzipSync]; }\n ], function (ev) { return pbf(gunzipSync(ev.data[0], ev.data[1])); }, 3, cb);\n}\nexport function gunzipSync(data, opts) {\n var st = gzs(data);\n if (st + 8 > data.length)\n err(6, 'invalid gzip data');\n return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);\n}\n/**\n * Streaming Zlib compression\n */\nvar Zlib = /*#__PURE__*/ (function () {\n function Zlib(opts, cb) {\n this.c = adler();\n this.v = 1;\n Deflate.call(this, opts, cb);\n }\n /**\n * Pushes a chunk to be zlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Zlib.prototype.push = function (chunk, final) {\n this.c.p(chunk);\n Deflate.prototype.push.call(this, chunk, final);\n };\n Zlib.prototype.p = function (c, f) {\n var raw = dopt(c, this.o, this.v && (this.o.dictionary ? 6 : 2), f && 4, this.s);\n if (this.v)\n zlh(raw, this.o), this.v = 0;\n if (f)\n wbytes(raw, raw.length - 4, this.c.d());\n this.ondata(raw, f);\n };\n /**\n * Flushes buffered uncompressed data. Useful to immediately retrieve the\n * zlibbed output for small inputs.\n * @param sync Whether to flush to a byte boundary. A sync flush takes 4-5\n * extra bytes, but guarantees all pushed data is immediately\n * decompressible.\n */\n Zlib.prototype.flush = function (sync) {\n Deflate.prototype.flush.call(this, sync);\n };\n return Zlib;\n}());\nexport { Zlib };\n/**\n * Asynchronous streaming Zlib compression\n */\nvar AsyncZlib = /*#__PURE__*/ (function () {\n function AsyncZlib(opts, cb) {\n astrmify([\n bDflt,\n zle,\n function () { return [astrm, Deflate, Zlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Zlib(ev.data);\n onmessage = astrm(strm);\n }, 10, 1);\n }\n return AsyncZlib;\n}());\nexport { AsyncZlib };\nexport function zlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bDflt,\n zle,\n function () { return [zlibSync]; }\n ], function (ev) { return pbf(zlibSync(ev.data[0], ev.data[1])); }, 4, cb);\n}\n/**\n * Compress data with Zlib\n * @param data The data to compress\n * @param opts The compression options\n * @returns The zlib-compressed version of the data\n */\nexport function zlibSync(data, opts) {\n if (!opts)\n opts = {};\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, opts.dictionary ? 6 : 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\n/**\n * Streaming Zlib decompression\n */\nvar Unzlib = /*#__PURE__*/ (function () {\n function Unzlib(opts, cb) {\n Inflate.call(this, opts, cb);\n this.v = opts && opts.dictionary ? 2 : 1;\n }\n /**\n * Pushes a chunk to be unzlibbed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzlib.prototype.push = function (chunk, final) {\n Inflate.prototype.e.call(this, chunk);\n if (this.v) {\n if (this.p.length < 6 && !final)\n return;\n this.p = this.p.subarray(zls(this.p, this.v - 1)), this.v = 0;\n }\n if (final) {\n if (this.p.length < 4)\n err(6, 'invalid zlib data');\n this.p = this.p.subarray(0, -4);\n }\n // necessary to prevent TS from using the closure value\n // This allows for workerization to function correctly\n Inflate.prototype.c.call(this, final);\n };\n return Unzlib;\n}());\nexport { Unzlib };\n/**\n * Asynchronous streaming Zlib decompression\n */\nvar AsyncUnzlib = /*#__PURE__*/ (function () {\n function AsyncUnzlib(opts, cb) {\n astrmify([\n bInflt,\n zule,\n function () { return [astrm, Inflate, Unzlib]; }\n ], this, StrmOpt.call(this, opts, cb), function (ev) {\n var strm = new Unzlib(ev.data);\n onmessage = astrm(strm);\n }, 11, 0);\n }\n return AsyncUnzlib;\n}());\nexport { AsyncUnzlib };\nexport function unzlib(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return cbify(data, opts, [\n bInflt,\n zule,\n function () { return [unzlibSync]; }\n ], function (ev) { return pbf(unzlibSync(ev.data[0], gopt(ev.data[1]))); }, 5, cb);\n}\nexport function unzlibSync(data, opts) {\n return inflt(data.subarray(zls(data, opts && opts.dictionary), -4), { i: 2 }, opts && opts.out, opts && opts.dictionary);\n}\n// Default algorithm for compression (used because having a known output size allows faster decompression)\nexport { gzip as compress, AsyncGzip as AsyncCompress };\nexport { gzipSync as compressSync, Gzip as Compress };\n/**\n * Streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar Decompress = /*#__PURE__*/ (function () {\n function Decompress(opts, cb) {\n this.o = StrmOpt.call(this, opts, cb) || {};\n this.G = Gunzip;\n this.I = Inflate;\n this.Z = Unzlib;\n }\n // init substream\n // overriden by AsyncDecompress\n Decompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (dat, final) {\n _this.ondata(dat, final);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Decompress.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (!this.s) {\n if (this.p && this.p.length) {\n var n = new u8(this.p.length + chunk.length);\n n.set(this.p), n.set(chunk, this.p.length);\n }\n else\n this.p = chunk;\n if (this.p.length > 2) {\n this.s = (this.p[0] == 31 && this.p[1] == 139 && this.p[2] == 8)\n ? new this.G(this.o)\n : ((this.p[0] & 15) != 8 || (this.p[0] >> 4) > 7 || ((this.p[0] << 8 | this.p[1]) % 31))\n ? new this.I(this.o)\n : new this.Z(this.o);\n this.i();\n this.s.push(this.p, final);\n this.p = null;\n }\n }\n else\n this.s.push(chunk, final);\n };\n return Decompress;\n}());\nexport { Decompress };\n/**\n * Asynchronous streaming GZIP, Zlib, or raw DEFLATE decompression\n */\nvar AsyncDecompress = /*#__PURE__*/ (function () {\n function AsyncDecompress(opts, cb) {\n Decompress.call(this, opts, cb);\n this.queuedSize = 0;\n this.G = AsyncGunzip;\n this.I = AsyncInflate;\n this.Z = AsyncUnzlib;\n }\n AsyncDecompress.prototype.i = function () {\n var _this = this;\n this.s.ondata = function (err, dat, final) {\n _this.ondata(err, dat, final);\n };\n this.s.ondrain = function (size) {\n _this.queuedSize -= size;\n if (_this.ondrain)\n _this.ondrain(size);\n };\n };\n /**\n * Pushes a chunk to be decompressed\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncDecompress.prototype.push = function (chunk, final) {\n this.queuedSize += chunk.length;\n Decompress.prototype.push.call(this, chunk, final);\n };\n return AsyncDecompress;\n}());\nexport { AsyncDecompress };\nexport function decompress(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzip(data, opts, cb)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflate(data, opts, cb)\n : unzlib(data, opts, cb);\n}\n/**\n * Expands compressed GZIP, Zlib, or raw DEFLATE data, automatically detecting the format\n * @param data The data to decompress\n * @param opts The decompression options\n * @returns The decompressed version of the data\n */\nexport function decompressSync(data, opts) {\n return (data[0] == 31 && data[1] == 139 && data[2] == 8)\n ? gunzipSync(data, opts)\n : ((data[0] & 15) != 8 || (data[0] >> 4) > 7 || ((data[0] << 8 | data[1]) % 31))\n ? inflateSync(data, opts)\n : unzlibSync(data, opts);\n}\n// flatten a directory structure\nvar fltn = function (d, p, t, o) {\n for (var k in d) {\n var val = d[k], n = p + k, op = o;\n if (Array.isArray(val))\n op = mrg(o, val[1]), val = val[0];\n if (ArrayBuffer.isView(val))\n t[n] = [val, op];\n else {\n t[n += '/'] = [new u8(0), op];\n fltn(val, n, t, o);\n }\n }\n};\n// text encoder\nvar te = typeof TextEncoder != 'undefined' && /*#__PURE__*/ new TextEncoder();\n// text decoder\nvar td = typeof TextDecoder != 'undefined' && /*#__PURE__*/ new TextDecoder();\n// text decoder stream\nvar tds = 0;\ntry {\n td.decode(et, { stream: true });\n tds = 1;\n}\ncatch (e) { }\n// decode UTF8\nvar dutf8 = function (d) {\n for (var r = '', i = 0;;) {\n var c = d[i++];\n var eb = (c > 127) + (c > 223) + (c > 239);\n if (i + eb > d.length)\n return { s: r, r: slc(d, i - 1) };\n if (!eb)\n r += String.fromCharCode(c);\n else if (eb == 3) {\n c = ((c & 15) << 18 | (d[i++] & 63) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63)) - 65536,\n r += String.fromCharCode(55296 | (c >> 10), 56320 | (c & 1023));\n }\n else if (eb & 1)\n r += String.fromCharCode((c & 31) << 6 | (d[i++] & 63));\n else\n r += String.fromCharCode((c & 15) << 12 | (d[i++] & 63) << 6 | (d[i++] & 63));\n }\n};\n/**\n * Streaming UTF-8 decoding\n */\nvar DecodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is decoded\n */\n function DecodeUTF8(cb) {\n this.ondata = cb;\n if (tds)\n this.t = new TextDecoder();\n else\n this.p = et;\n }\n /**\n * Pushes a chunk to be decoded from UTF-8 binary\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n DecodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n final = !!final;\n if (this.t) {\n this.ondata(this.t.decode(chunk, { stream: true }), final);\n if (final) {\n if (this.t.decode().length)\n err(8);\n this.t = null;\n }\n return;\n }\n if (!this.p)\n err(4);\n var dat = new u8(this.p.length + chunk.length);\n dat.set(this.p);\n dat.set(chunk, this.p.length);\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (final) {\n if (r.length)\n err(8);\n this.p = null;\n }\n else\n this.p = r;\n this.ondata(s, final);\n };\n return DecodeUTF8;\n}());\nexport { DecodeUTF8 };\n/**\n * Streaming UTF-8 encoding\n */\nvar EncodeUTF8 = /*#__PURE__*/ (function () {\n /**\n * Creates a UTF-8 decoding stream\n * @param cb The callback to call whenever data is encoded\n */\n function EncodeUTF8(cb) {\n this.ondata = cb;\n }\n /**\n * Pushes a chunk to be encoded to UTF-8\n * @param chunk The string data to push\n * @param final Whether this is the last chunk\n */\n EncodeUTF8.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n if (this.d)\n err(4);\n this.ondata(strToU8(chunk), this.d = final || false);\n };\n return EncodeUTF8;\n}());\nexport { EncodeUTF8 };\n/**\n * Converts a string into a Uint8Array for use with compression/decompression methods\n * @param str The string to encode\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless decoding a binary string.\n * @returns The string encoded in UTF-8/Latin-1 binary\n */\nexport function strToU8(str, latin1) {\n if (latin1) {\n var ar_1 = new u8(str.length);\n for (var i = 0; i < str.length; ++i)\n ar_1[i] = str.charCodeAt(i);\n return ar_1;\n }\n if (te)\n return te.encode(str);\n var l = str.length;\n var ar = new u8(str.length + (str.length >> 1));\n var ai = 0;\n var w = function (v) { ar[ai++] = v; };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + ((l - i) << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | (c >> 6)), w(128 | (c & 63));\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | (str.charCodeAt(++i) & 1023),\n w(240 | (c >> 18)), w(128 | ((c >> 12) & 63)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n else\n w(224 | (c >> 12)), w(128 | ((c >> 6) & 63)), w(128 | (c & 63));\n }\n return slc(ar, 0, ai);\n}\n/**\n * Converts a Uint8Array to a string\n * @param dat The data to decode to string\n * @param latin1 Whether or not to interpret the data as Latin-1. This should\n * not need to be true unless encoding to binary string.\n * @returns The original UTF-8/Latin-1 string\n */\nexport function strFromU8(dat, latin1) {\n if (latin1) {\n var r = '';\n for (var i = 0; i < dat.length; i += 16384)\n r += String.fromCharCode.apply(null, dat.subarray(i, i + 16384));\n return r;\n }\n else if (td) {\n return td.decode(dat);\n }\n else {\n var _a = dutf8(dat), s = _a.s, r = _a.r;\n if (r.length)\n err(8);\n return s;\n }\n}\n;\n// deflate bit flag\nvar dbf = function (l) { return l == 1 ? 3 : l < 6 ? 2 : l == 9 ? 1 : 0; };\n// skip local zip header\nvar slzh = function (d, b) { return b + 30 + b2(d, b + 26) + b2(d, b + 28); };\n// read zip header\nvar zh = function (d, b, z) {\n var fnl = b2(d, b + 28), efl = b2(d, b + 30), fn = strFromU8(d.subarray(b + 46, b + 46 + fnl), !(b2(d, b + 8) & 2048)), es = b + 46 + fnl;\n var _a = z64hs(d, es, efl, z, b4(d, b + 20), b4(d, b + 24), b4(d, b + 42)), sc = _a[0], su = _a[1], off = _a[2];\n return [b2(d, b + 10), sc, su, fn, es + efl + b2(d, b + 32), off];\n};\n// read zip64 header sizes\nvar z64hs = function (d, b, l, z, sc, su, off) {\n var nsc = sc == 4294967295, nsu = su == 4294967295, noff = off == 4294967295, e = b + l;\n var nf = nsc + nsu + noff;\n if (z && nf) {\n for (; b + 4 < e; b += 4 + b2(d, b + 2)) {\n if (b2(d, b) == 1) {\n return [\n nsc ? b8(d, b + 4 + 8 * nsu) : sc,\n nsu ? b8(d, b + 4) : su,\n noff ? b8(d, b + 4 + 8 * (nsu + nsc)) : off,\n 1\n ];\n }\n }\n // z == 2 for unknown whether or not zip64\n if (z < 2)\n err(13);\n }\n return [sc, su, off, 0];\n};\n// extra field length\nvar exfl = function (ex) {\n var le = 0;\n if (ex) {\n for (var k in ex) {\n var l = ex[k].length;\n if (l > 65535)\n err(9);\n le += l + 4;\n }\n }\n return le;\n};\n// write zip header\nvar wzh = function (d, b, f, fn, u, c, ce, co) {\n var fl = fn.length, ex = f.extra, col = co && co.length;\n var exl = exfl(ex);\n wbytes(d, b, ce != null ? 0x2014B50 : 0x4034B50), b += 4;\n if (ce != null)\n d[b++] = 20, d[b++] = f.os;\n d[b] = 20, b += 2; // spec compliance? what's that?\n d[b++] = (f.flag << 1) | (c < 0 && 8), d[b++] = u && 8;\n d[b++] = f.compression & 255, d[b++] = f.compression >> 8;\n var dt = new Date(f.mtime == null ? Date.now() : f.mtime), y = dt.getFullYear() - 1980;\n if (y < 0 || y > 119)\n err(10);\n wbytes(d, b, (y << 25) | ((dt.getMonth() + 1) << 21) | (dt.getDate() << 16) | (dt.getHours() << 11) | (dt.getMinutes() << 5) | (dt.getSeconds() >> 1)), b += 4;\n if (c != -1) {\n wbytes(d, b, f.crc);\n wbytes(d, b + 4, c < 0 ? -c - 2 : c);\n wbytes(d, b + 8, f.size);\n }\n wbytes(d, b + 12, fl);\n wbytes(d, b + 14, exl), b += 16;\n if (ce != null) {\n wbytes(d, b, col);\n wbytes(d, b + 6, f.attrs);\n wbytes(d, b + 10, ce), b += 14;\n }\n d.set(fn, b);\n b += fl;\n if (exl) {\n for (var k in ex) {\n var exf = ex[k], l = exf.length;\n wbytes(d, b, +k);\n wbytes(d, b + 2, l);\n d.set(exf, b + 4), b += 4 + l;\n }\n }\n if (col)\n d.set(co, b), b += col;\n return b;\n};\n// write zip footer (end of central directory)\nvar wzf = function (o, b, c, d, e) {\n wbytes(o, b, 0x6054B50); // skip disk\n wbytes(o, b + 8, c);\n wbytes(o, b + 10, c);\n wbytes(o, b + 12, d);\n wbytes(o, b + 16, e);\n};\n/**\n * A pass-through stream to keep data uncompressed in a ZIP archive.\n */\nvar ZipPassThrough = /*#__PURE__*/ (function () {\n /**\n * Creates a pass-through stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n */\n function ZipPassThrough(filename) {\n this.filename = filename;\n this.c = crc();\n this.size = 0;\n this.compression = 0;\n }\n /**\n * Processes a chunk and pushes to the output stream. You can override this\n * method in a subclass for custom behavior, but by default this passes\n * the data through. You must call this.ondata(err, chunk, final) at some\n * point in this method.\n * @param chunk The chunk to process\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.process = function (chunk, final) {\n this.ondata(null, chunk, final);\n };\n /**\n * Pushes a chunk to be added. If you are subclassing this with a custom\n * compression algorithm, note that you must push data from the source\n * file only, pre-compression.\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipPassThrough.prototype.push = function (chunk, final) {\n if (!this.ondata)\n err(5);\n this.c.p(chunk);\n this.size += chunk.length;\n if (final)\n this.crc = this.c.d();\n // we shouldn't really do this cast, but properly handling ArrayBufferLike\n // makes the API unergonomic with Buffer\n this.process(chunk, final || false);\n };\n return ZipPassThrough;\n}());\nexport { ZipPassThrough };\n// I don't extend because TypeScript extension adds 1kB of runtime bloat\n/**\n * Streaming DEFLATE compression for ZIP archives. Prefer using AsyncZipDeflate\n * for better performance\n */\nvar ZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function ZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new Deflate(opts, function (dat, final) {\n _this.ondata(null, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n }\n ZipDeflate.prototype.process = function (chunk, final) {\n try {\n this.d.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n ZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return ZipDeflate;\n}());\nexport { ZipDeflate };\n/**\n * Asynchronous streaming DEFLATE compression for ZIP archives\n */\nvar AsyncZipDeflate = /*#__PURE__*/ (function () {\n /**\n * Creates an asynchronous DEFLATE stream that can be added to ZIP archives\n * @param filename The filename to associate with this data stream\n * @param opts The compression options\n */\n function AsyncZipDeflate(filename, opts) {\n var _this = this;\n if (!opts)\n opts = {};\n ZipPassThrough.call(this, filename);\n this.d = new AsyncDeflate(opts, function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.compression = 8;\n this.flag = dbf(opts.level);\n this.terminate = this.d.terminate;\n }\n AsyncZipDeflate.prototype.process = function (chunk, final) {\n this.d.push(chunk, final);\n };\n /**\n * Pushes a chunk to be deflated\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n AsyncZipDeflate.prototype.push = function (chunk, final) {\n ZipPassThrough.prototype.push.call(this, chunk, final);\n };\n return AsyncZipDeflate;\n}());\nexport { AsyncZipDeflate };\n// TODO: Better tree shaking\n/**\n * A zippable archive to which files can incrementally be added\n */\nvar Zip = /*#__PURE__*/ (function () {\n /**\n * Creates an empty ZIP archive to which files can be added\n * @param cb The callback to call whenever data for the generated ZIP archive\n * is available\n */\n function Zip(cb) {\n this.ondata = cb;\n this.u = [];\n this.d = 1;\n }\n /**\n * Adds a file to the ZIP archive\n * @param file The file stream to add\n */\n Zip.prototype.add = function (file) {\n var _this = this;\n if (!this.ondata)\n err(5);\n // finishing or finished\n if (this.d & 2)\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, false);\n else {\n var f = strToU8(file.filename), fl_1 = f.length;\n var com = file.comment, o = com && strToU8(com);\n var u = fl_1 != file.filename.length || (o && (com.length != o.length));\n var hl_1 = fl_1 + exfl(file.extra) + 30;\n if (fl_1 > 65535)\n this.ondata(err(11, 0, 1), null, false);\n var header = new u8(hl_1);\n wzh(header, 0, file, f, u, -1);\n var chks_1 = [header];\n var pAll_1 = function () {\n for (var _i = 0, chks_2 = chks_1; _i < chks_2.length; _i++) {\n var chk = chks_2[_i];\n _this.ondata(null, chk, false);\n }\n chks_1 = [];\n };\n var tr_1 = this.d;\n this.d = 0;\n var ind_1 = this.u.length;\n var uf_1 = mrg(file, {\n f: f,\n u: u,\n o: o,\n t: function () {\n if (file.terminate)\n file.terminate();\n },\n r: function () {\n pAll_1();\n if (tr_1) {\n var nxt = _this.u[ind_1 + 1];\n if (nxt)\n nxt.r();\n else\n _this.d = 1;\n }\n tr_1 = 1;\n }\n });\n var cl_1 = 0;\n file.ondata = function (err, dat, final) {\n if (err) {\n _this.ondata(err, dat, final);\n _this.terminate();\n }\n else {\n cl_1 += dat.length;\n chks_1.push(dat);\n if (final) {\n var dd = new u8(16);\n wbytes(dd, 0, 0x8074B50);\n wbytes(dd, 4, file.crc);\n wbytes(dd, 8, cl_1);\n wbytes(dd, 12, file.size);\n chks_1.push(dd);\n uf_1.c = cl_1, uf_1.b = hl_1 + cl_1 + 16, uf_1.crc = file.crc, uf_1.size = file.size;\n if (tr_1)\n uf_1.r();\n tr_1 = 1;\n }\n else if (tr_1)\n pAll_1();\n }\n };\n this.u.push(uf_1);\n }\n };\n /**\n * Ends the process of adding files and prepares to emit the final chunks.\n * This *must* be called after adding all desired files for the resulting\n * ZIP file to work properly.\n */\n Zip.prototype.end = function () {\n var _this = this;\n if (this.d & 2) {\n this.ondata(err(4 + (this.d & 1) * 8, 0, 1), null, true);\n return;\n }\n if (this.d)\n this.e();\n else\n this.u.push({\n r: function () {\n if (!(_this.d & 1))\n return;\n _this.u.splice(-1, 1);\n _this.e();\n },\n t: function () { }\n });\n this.d = 3;\n };\n Zip.prototype.e = function () {\n var bt = 0, l = 0, tl = 0;\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n tl += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0);\n }\n var out = new u8(tl + 22);\n for (var _b = 0, _c = this.u; _b < _c.length; _b++) {\n var f = _c[_b];\n wzh(out, bt, f, f.f, f.u, -f.c - 2, l, f.o);\n bt += 46 + f.f.length + exfl(f.extra) + (f.o ? f.o.length : 0), l += f.b;\n }\n wzf(out, bt, this.u.length, tl, l);\n this.ondata(null, out, true);\n this.d = 2;\n };\n /**\n * A method to terminate any internal workers used by the stream. Subsequent\n * calls to add() will fail.\n */\n Zip.prototype.terminate = function () {\n for (var _i = 0, _a = this.u; _i < _a.length; _i++) {\n var f = _a[_i];\n f.t();\n }\n this.d = 2;\n };\n return Zip;\n}());\nexport { Zip };\nexport function zip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var r = {};\n fltn(data, '', r, opts);\n var k = Object.keys(r);\n var lft = k.length, o = 0, tot = 0;\n var slft = lft, files = new Array(lft);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var cbf = function () {\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n tot = 0;\n for (var i = 0; i < slft; ++i) {\n var f = files[i];\n try {\n var l = f.c.length;\n wzh(out, tot, f, f.f, f.u, l);\n var badd = 30 + f.f.length + exfl(f.extra);\n var loc = tot + badd;\n out.set(f.c, loc);\n wzh(out, o, f, f.f, f.u, l, tot, f.m), o += 16 + badd + (f.m ? f.m.length : 0), tot = loc + l;\n }\n catch (e) {\n return cbd(e, null);\n }\n }\n wzf(out, o, files.length, cdl, oe);\n cbd(null, out);\n };\n if (!lft)\n cbf();\n var _loop_1 = function (i) {\n var fn = k[i];\n var _a = r[fn], file = _a[0], p = _a[1];\n var c = crc(), size = file.length;\n c.p(file);\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n var compression = p.level == 0 ? 0 : 8;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n var l = d.length;\n files[i] = mrg(p, {\n size: size,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n compression: compression\n });\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n if (!--lft)\n cbf();\n }\n };\n if (s > 65535)\n cbl(err(11, 0, 1), null);\n if (!compression)\n cbl(null, file);\n else if (size < 160000) {\n try {\n cbl(null, deflateSync(file, p));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(deflate(file, p, cbl));\n };\n // Cannot use lft because it can decrease\n for (var i = 0; i < slft; ++i) {\n _loop_1(i);\n }\n return tAll;\n}\n/**\n * Synchronously creates a ZIP file. Prefer using `zip` for better performance\n * with more than one file.\n * @param data The directory structure for the ZIP archive\n * @param opts The main options, merged with per-file options\n * @returns The generated ZIP archive\n */\nexport function zipSync(data, opts) {\n if (!opts)\n opts = {};\n var r = {};\n var files = [];\n fltn(data, '', r, opts);\n var o = 0;\n var tot = 0;\n for (var fn in r) {\n var _a = r[fn], file = _a[0], p = _a[1];\n var compression = p.level == 0 ? 0 : 8;\n var f = strToU8(fn), s = f.length;\n var com = p.comment, m = com && strToU8(com), ms = m && m.length;\n var exl = exfl(p.extra);\n if (s > 65535)\n err(11);\n var d = compression ? deflateSync(file, p) : file, l = d.length;\n var c = crc();\n c.p(file);\n files.push(mrg(p, {\n size: file.length,\n crc: c.d(),\n c: d,\n f: f,\n m: m,\n u: s != fn.length || (m && (com.length != ms)),\n o: o,\n compression: compression\n }));\n o += 30 + s + exl + l;\n tot += 76 + 2 * (s + exl) + (ms || 0) + l;\n }\n var out = new u8(tot + 22), oe = o, cdl = tot - o;\n for (var i = 0; i < files.length; ++i) {\n var f = files[i];\n wzh(out, f.o, f, f.f, f.u, f.c.length);\n var badd = 30 + f.f.length + exfl(f.extra);\n out.set(f.c, f.o + badd);\n wzh(out, o, f, f.f, f.u, f.c.length, f.o, f.m), o += 16 + badd + (f.m ? f.m.length : 0);\n }\n wzf(out, o, files.length, cdl, oe);\n return out;\n}\n/**\n * Streaming pass-through decompression for ZIP archives\n */\nvar UnzipPassThrough = /*#__PURE__*/ (function () {\n function UnzipPassThrough() {\n }\n UnzipPassThrough.prototype.push = function (chunk, final) {\n // same as ZipPassThrough: cast to retain Buffer ergonomics\n this.ondata(null, chunk, final);\n };\n UnzipPassThrough.compression = 0;\n return UnzipPassThrough;\n}());\nexport { UnzipPassThrough };\n/**\n * Streaming DEFLATE decompression for ZIP archives. Prefer AsyncZipInflate for\n * better performance.\n */\nvar UnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function UnzipInflate() {\n var _this = this;\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n UnzipInflate.prototype.push = function (chunk, final) {\n try {\n this.i.push(chunk, final);\n }\n catch (e) {\n this.ondata(e, null, final);\n }\n };\n UnzipInflate.compression = 8;\n return UnzipInflate;\n}());\nexport { UnzipInflate };\n/**\n * Asynchronous streaming DEFLATE decompression for ZIP archives\n */\nvar AsyncUnzipInflate = /*#__PURE__*/ (function () {\n /**\n * Creates a DEFLATE decompression that can be used in ZIP archives\n */\n function AsyncUnzipInflate(_, sz) {\n var _this = this;\n if (sz < 320000) {\n this.i = new Inflate(function (dat, final) {\n _this.ondata(null, dat, final);\n });\n }\n else {\n this.i = new AsyncInflate(function (err, dat, final) {\n _this.ondata(err, dat, final);\n });\n this.terminate = this.i.terminate;\n }\n }\n AsyncUnzipInflate.prototype.push = function (chunk, final) {\n if (this.i.terminate)\n chunk = slc(chunk, 0);\n this.i.push(chunk, final);\n };\n AsyncUnzipInflate.compression = 8;\n return AsyncUnzipInflate;\n}());\nexport { AsyncUnzipInflate };\n/**\n * A ZIP archive decompression stream that emits files as they are discovered\n */\nvar Unzip = /*#__PURE__*/ (function () {\n /**\n * Creates a ZIP decompression stream\n * @param cb The callback to call whenever a file in the ZIP archive is found\n */\n function Unzip(cb) {\n this.onfile = cb;\n this.k = [];\n this.o = {\n 0: UnzipPassThrough\n };\n this.p = et;\n }\n /**\n * Pushes a chunk to be unzipped\n * @param chunk The chunk to push\n * @param final Whether this is the last chunk\n */\n Unzip.prototype.push = function (chunk, final) {\n var _this = this;\n if (!this.onfile)\n err(5);\n if (!this.p)\n err(4);\n if (this.c > 0) {\n var len = Math.min(this.c, chunk.length);\n var toAdd = chunk.subarray(0, len);\n this.c -= len;\n if (this.d)\n this.d.push(toAdd, !this.c);\n else\n this.k[0].push(toAdd);\n chunk = chunk.subarray(len);\n if (chunk.length)\n return this.push(chunk, final);\n }\n else {\n var f = 0, i = 0, is = void 0, buf = void 0;\n if (!this.p.length)\n buf = chunk;\n else if (!chunk.length)\n buf = this.p;\n else {\n buf = new u8(this.p.length + chunk.length);\n buf.set(this.p), buf.set(chunk, this.p.length);\n }\n var l = buf.length, oc = this.c, add = oc && this.d;\n var _loop_2 = function () {\n var sig = b4(buf, i);\n if (sig == 0x4034B50) {\n f = 1, is = i;\n this_1.d = null;\n this_1.c = 0;\n var bf = b2(buf, i + 6), cmp_1 = b2(buf, i + 8), u = bf & 2048, dd = bf & 8, fnl = b2(buf, i + 26), es = b2(buf, i + 28);\n if (l > i + 30 + fnl + es) {\n var chks_3 = [];\n this_1.k.unshift(chks_3);\n f = 2;\n var lsc = b4(buf, i + 18), lsu = b4(buf, i + 22);\n var fn_1 = strFromU8(buf.subarray(i + 30, i += 30 + fnl), !u);\n var _a = z64hs(buf, i, es, 2, lsc, lsu, 0), sc_1 = _a[0], su_1 = _a[1], z64 = _a[3];\n if (dd)\n sc_1 = -1 - z64;\n i += es;\n this_1.c = sc_1;\n var d_1;\n var file_1 = {\n name: fn_1,\n compression: cmp_1,\n start: function () {\n if (!file_1.ondata)\n err(5);\n if (!sc_1)\n file_1.ondata(null, et, true);\n else {\n var ctr = _this.o[cmp_1];\n if (!ctr)\n file_1.ondata(err(14, 'unknown compression type ' + cmp_1, 1), null, false);\n d_1 = sc_1 < 0 ? new ctr(fn_1) : new ctr(fn_1, sc_1, su_1);\n d_1.ondata = function (err, dat, final) { file_1.ondata(err, dat, final); };\n for (var _i = 0, chks_4 = chks_3; _i < chks_4.length; _i++) {\n var dat = chks_4[_i];\n d_1.push(dat, false);\n }\n if (_this.k[0] == chks_3 && _this.c)\n _this.d = d_1;\n else\n d_1.push(et, true);\n }\n },\n terminate: function () {\n if (d_1 && d_1.terminate)\n d_1.terminate();\n }\n };\n if (sc_1 >= 0)\n file_1.size = sc_1, file_1.originalSize = su_1;\n this_1.onfile(file_1);\n }\n return \"break\";\n }\n else if (oc) {\n if (sig == 0x8074B50) {\n is = i += 12 + (oc == -2 && 8), f = 3, this_1.c = 0;\n return \"break\";\n }\n else if (sig == 0x2014B50) {\n is = i -= 4, f = 3, this_1.c = 0;\n return \"break\";\n }\n }\n };\n var this_1 = this;\n for (; i < l - 4; ++i) {\n var state_1 = _loop_2();\n if (state_1 === \"break\")\n break;\n }\n this.p = et;\n if (oc < 0) {\n var dat = f ? buf.subarray(0, is - 12 - (oc == -2 && 8) - (b4(buf, is - 16) == 0x8074B50 && 4)) : buf.subarray(0, i);\n if (add)\n add.push(dat, !!f);\n else\n this.k[+(f == 2)].push(dat);\n }\n if (f & 2)\n return this.push(buf.subarray(i), final);\n this.p = buf.subarray(i);\n }\n if (final) {\n if (this.c)\n err(13);\n this.p = null;\n }\n };\n /**\n * Registers a decoder with the stream, allowing for files compressed with\n * the compression type provided to be expanded correctly\n * @param decoder The decoder constructor\n */\n Unzip.prototype.register = function (decoder) {\n this.o[decoder.compression] = decoder;\n };\n return Unzip;\n}());\nexport { Unzip };\nvar mt = typeof queueMicrotask == 'function' ? queueMicrotask : typeof setTimeout == 'function' ? setTimeout : function (fn) { fn(); };\nexport function unzip(data, opts, cb) {\n if (!cb)\n cb = opts, opts = {};\n if (typeof cb != 'function')\n err(7);\n var term = [];\n var tAll = function () {\n for (var i = 0; i < term.length; ++i)\n term[i]();\n };\n var files = {};\n var cbd = function (a, b) {\n mt(function () { cb(a, b); });\n };\n mt(function () { cbd = cb; });\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558) {\n cbd(err(13, 0, 1), null);\n return tAll;\n }\n }\n ;\n var lft = b2(data, e + 8);\n if (lft) {\n var c = lft;\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = lft = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n var _loop_3 = function (i) {\n var _a = zh(data, o, z), c_1 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n var cbl = function (e, d) {\n if (e) {\n tAll();\n cbd(e, null);\n }\n else {\n if (d)\n files[fn] = d;\n if (!--lft)\n cbd(null, files);\n }\n };\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_1\n })) {\n if (!c_1)\n cbl(null, slc(data, b, b + sc));\n else if (c_1 == 8) {\n var infl = data.subarray(b, b + sc);\n // Synchronously decompress under 512KB, or barely-compressed data\n if (su < 524288 || sc > 0.8 * su) {\n try {\n cbl(null, inflateSync(infl, { out: new u8(su) }));\n }\n catch (e) {\n cbl(e, null);\n }\n }\n else\n term.push(inflate(infl, { size: su }, cbl));\n }\n else\n cbl(err(14, 'unknown compression type ' + c_1, 1), null);\n }\n else\n cbl(null, null);\n };\n for (var i = 0; i < c; ++i) {\n _loop_3(i);\n }\n }\n else\n cbd(null, {});\n return tAll;\n}\n/**\n * Synchronously decompresses a ZIP archive. Prefer using `unzip` for better\n * performance with more than one file.\n * @param data The raw compressed ZIP file\n * @param opts The ZIP extraction options\n * @returns The decompressed files\n */\nexport function unzipSync(data, opts) {\n var files = {};\n var e = data.length - 22;\n for (; b4(data, e) != 0x6054B50; --e) {\n if (!e || data.length - e > 65558)\n err(13);\n }\n ;\n var c = b2(data, e + 8);\n if (!c)\n return {};\n var o = b4(data, e + 16);\n var z = b4(data, e - 20) == 0x7064B50;\n if (z) {\n var ze = b4(data, e - 12);\n z = b4(data, ze) == 0x6064B50;\n if (z) {\n c = b4(data, ze + 32);\n o = b4(data, ze + 48);\n }\n }\n var fltr = opts && opts.filter;\n for (var i = 0; i < c; ++i) {\n var _a = zh(data, o, z), c_2 = _a[0], sc = _a[1], su = _a[2], fn = _a[3], no = _a[4], off = _a[5], b = slzh(data, off);\n o = no;\n if (!fltr || fltr({\n name: fn,\n size: sc,\n originalSize: su,\n compression: c_2\n })) {\n if (!c_2)\n files[fn] = slc(data, b, b + sc);\n else if (c_2 == 8)\n files[fn] = inflateSync(data.subarray(b, b + sc), { out: new u8(su) });\n else\n err(14, 'unknown compression type ' + c_2);\n }\n }\n return files;\n}\n", "const isBigEndian = (new Uint8Array(new Uint32Array([0x12345678]).buffer)[0] === 0x12);\n\n/**\n * @param {Uint8Array} b\n * @param {number} n\n * @param {number} m\n */\nconst swap = (b, n, m) => {\n let i = b[n];\n b[n] = b[m];\n b[m] = i;\n};\n\n/**\n * @param {Uint8Array} array\n */\nconst swap32 = (array) => {\n const len = array.length;\n for (let i = 0; i < len; i += 4) {\n swap(array, i, i + 3);\n swap(array, i + 1, i + 2);\n }\n};\n\n/**\n * Swap byte order of each 32-bit word in-place when running on a big-endian host,\n * so the trie data is little-endian as expected by the runtime.\n * @param {Uint8Array} array\n */\nexport const swap32LE = (array) => {\n if (isBigEndian) {\n swap32(array);\n }\n};\n", "import { inflateSync } from 'fflate';\nimport { swap32LE } from './swap.js';\n\n/**\n * Pre-parsed trie payload (e.g. from UnicodeTrieBuilder.freeze).\n * @typedef {object} UnicodeTrieInit\n * @property {Int32Array | Uint32Array} data\n * @property {number} highStart\n * @property {number} errorValue\n */\n\n/**\n * Duck-type Node Buffer (has LE/BE readers + slice), matching prior runtime checks.\n * @param {unknown} value\n * @returns {value is Buffer}\n */\nfunction isNodeBuffer(value) {\n return (\n typeof value === 'object'\n && value !== null\n && 'readUInt32BE' in value\n && 'readUInt32LE' in value\n && 'slice' in value\n && typeof value.readUInt32BE === 'function'\n && typeof value.readUInt32LE === 'function'\n && typeof value.slice === 'function'\n );\n}\n\n// Shift size for getting the index-1 table offset.\nconst SHIFT_1 = 6 + 5;\n\n// Shift size for getting the index-2 table offset.\nconst SHIFT_2 = 5;\n\n// Difference between the two shift sizes,\n// for getting an index-1 offset from an index-2 offset. 6=11-5\nconst SHIFT_1_2 = SHIFT_1 - SHIFT_2;\n\n// Number of index-1 entries for the BMP. 32=0x20\n// This part of the index-1 table is omitted from the serialized form.\nconst OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> SHIFT_1;\n\n// Number of entries in an index-2 block. 64=0x40\nconst INDEX_2_BLOCK_LENGTH = 1 << SHIFT_1_2;\n\n// Mask for getting the lower bits for the in-index-2-block offset. */\nconst INDEX_2_MASK = INDEX_2_BLOCK_LENGTH - 1;\n\n// Shift size for shifting left the index array values.\n// Increases possible data size with 16-bit index values at the cost\n// of compactability.\n// This requires data blocks to be aligned by DATA_GRANULARITY.\nconst INDEX_SHIFT = 2;\n\n// Number of entries in a data block. 32=0x20\nconst DATA_BLOCK_LENGTH = 1 << SHIFT_2;\n\n// Mask for getting the lower bits for the in-data-block offset.\nconst DATA_MASK = DATA_BLOCK_LENGTH - 1;\n\n// The part of the index-2 table for U+D800..U+DBFF stores values for\n// lead surrogate code _units_ not code _points_.\n// Values for lead surrogate code _points_ are indexed with this portion of the table.\n// Length=32=0x20=0x400>>SHIFT_2. (There are 1024=0x400 lead surrogates.)\nconst LSCP_INDEX_2_OFFSET = 0x10000 >> SHIFT_2;\nconst LSCP_INDEX_2_LENGTH = 0x400 >> SHIFT_2;\n\n// Count the lengths of both BMP pieces. 2080=0x820\nconst INDEX_2_BMP_LENGTH = LSCP_INDEX_2_OFFSET + LSCP_INDEX_2_LENGTH;\n\n// The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.\n// Length 32=0x20 for lead bytes C0..DF, regardless of SHIFT_2.\nconst UTF8_2B_INDEX_2_OFFSET = INDEX_2_BMP_LENGTH;\nconst UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; // U+0800 is the first code point after 2-byte UTF-8\n\n// The index-1 table, only used for supplementary code points, at offset 2112=0x840.\n// Variable length, for code points up to highStart, where the last single-value range starts.\n// Maximum length 512=0x200=0x100000>>SHIFT_1.\n// (For 0x100000 supplementary code points U+10000..U+10ffff.)\n//\n// The part of the index-2 table for supplementary code points starts\n// after this index-1 table.\n//\n// Both the index-1 table and the following part of the index-2 table\n// are omitted completely if there is only BMP data.\nconst INDEX_1_OFFSET = UTF8_2B_INDEX_2_OFFSET + UTF8_2B_INDEX_2_LENGTH;\n\n// The alignment size of a data block. Also the granularity for compaction.\nconst DATA_GRANULARITY = 1 << INDEX_SHIFT;\n\nclass UnicodeTrie {\n /**\n * @param {Uint8Array | Buffer | UnicodeTrieInit} data\n */\n constructor(data) {\n if (isNodeBuffer(data) || data instanceof Uint8Array) {\n // read binary format\n /** @type {Uint8Array} */\n let bytes;\n let uncompressedLength;\n if (isNodeBuffer(data)) {\n this.highStart = data.readUInt32LE(0);\n this.errorValue = data.readUInt32LE(4);\n uncompressedLength = data.readUInt32LE(8);\n // View past the 12-byte header (avoids Buffer.slice \u2192 Uint8Array assignability issues).\n bytes = new Uint8Array(data.buffer, data.byteOffset + 12, data.byteLength - 12);\n } else {\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\n this.highStart = view.getUint32(0, true);\n this.errorValue = view.getUint32(4, true);\n uncompressedLength = view.getUint32(8, true);\n bytes = data.subarray(12);\n }\n\n // inflate the actual trie data (raw deflate, matching builder)\n bytes = inflateSync(bytes, { out: new Uint8Array(uncompressedLength) });\n\n // swap bytes from little-endian\n swap32LE(bytes);\n\n /**\n * Compacted index + data table.\n * @type {Uint32Array | Int32Array}\n */\n this.data = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength >> 2);\n } else {\n // pre-parsed data\n /**\n * Compacted index + data table.\n * @type {Uint32Array | Int32Array}\n */\n this.data = data.data;\n /**\n * First code point of the final single-value range.\n * @type {number}\n */\n this.highStart = data.highStart;\n /**\n * Value returned for out-of-range code points.\n * @type {number}\n */\n this.errorValue = data.errorValue;\n }\n }\n\n /**\n * @param {number} codePoint\n * @returns {number}\n */\n get(codePoint) {\n let index;\n if ((codePoint < 0) || (codePoint > 0x10ffff)) {\n return this.errorValue;\n }\n\n if ((codePoint < 0xd800) || ((codePoint > 0xdbff) && (codePoint <= 0xffff))) {\n // Ordinary BMP code point, excluding leading surrogates.\n // BMP uses a single level lookup. BMP index starts at offset 0 in the index.\n // data is stored in the index array itself.\n index = (this.data[codePoint >> SHIFT_2] << INDEX_SHIFT) + (codePoint & DATA_MASK);\n return this.data[index];\n }\n\n if (codePoint <= 0xffff) {\n // Lead Surrogate Code Point. A Separate index section is stored for\n // lead surrogate code units and code points.\n // The main index has the code unit data.\n // For this function, we need the code point data.\n index = (this.data[LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> SHIFT_2)] << INDEX_SHIFT) + (codePoint & DATA_MASK);\n return this.data[index];\n }\n\n if (codePoint < this.highStart) {\n // Supplemental code point, use two-level lookup.\n index = this.data[(INDEX_1_OFFSET - OMITTED_BMP_INDEX_1_LENGTH) + (codePoint >> SHIFT_1)];\n index = this.data[index + ((codePoint >> SHIFT_2) & INDEX_2_MASK)];\n index = (index << INDEX_SHIFT) + (codePoint & DATA_MASK);\n return this.data[index];\n }\n\n return this.data[this.data.length - DATA_GRANULARITY];\n }\n}\n\nexport default UnicodeTrie;\n", "/**\n * Lookup tables packed into the unicode-properties trie.\n * @typedef {object} UnicodePropertiesTables\n * @property {string[]} categories\n * @property {string[]} combiningClasses\n * @property {string[]} scripts\n * @property {string[]} eaw\n */\n\n/**\n * @type {UnicodePropertiesTables}\n */\nexport default { categories: ['Cc', 'Zs', 'Po', 'Sc', 'Ps', 'Pe', 'Sm', 'Pd', 'Nd', 'Lu', 'Sk', 'Pc', 'Ll', 'So', 'Lo', 'Pi', 'Cf', 'No', 'Pf', 'Lt', 'Lm', 'Mn', 'Me', 'Mc', 'Nl', 'Zl', 'Zp', 'Cs', 'Co'], combiningClasses: ['Not_Reordered', 'Above', 'Above_Right', 'Below', 'Attached_Above_Right', 'Attached_Below', 'Overlay', 'Iota_Subscript', 'Double_Below', 'Double_Above', 'Below_Right', 'Above_Left', 'CCC10', 'CCC11', 'CCC12', 'CCC13', 'CCC14', 'CCC15', 'CCC16', 'CCC17', 'CCC18', 'CCC19', 'CCC20', 'CCC21', 'CCC22', 'CCC23', 'CCC24', 'CCC25', 'CCC30', 'CCC31', 'CCC32', 'CCC27', 'CCC28', 'CCC29', 'CCC33', 'CCC34', 'CCC35', 'CCC36', 'Nukta', 'Virama', 'CCC84', 'CCC91', 'CCC103', 'CCC107', 'CCC118', 'CCC122', 'CCC129', 'CCC130', 'CCC132', 'Attached_Above', 'Below_Left', 'Left', 'Kana_Voicing', 'CCC26', 'Right'], scripts: ['Common', 'Latin', 'Bopomofo', 'Inherited', 'Greek', 'Coptic', 'Cyrillic', 'Armenian', 'Hebrew', 'Arabic', 'Syriac', 'Thaana', 'Nko', 'Samaritan', 'Mandaic', 'Devanagari', 'Bengali', 'Gurmukhi', 'Gujarati', 'Oriya', 'Tamil', 'Telugu', 'Kannada', 'Malayalam', 'Sinhala', 'Thai', 'Lao', 'Tibetan', 'Myanmar', 'Georgian', 'Hangul', 'Ethiopic', 'Cherokee', 'Canadian_Aboriginal', 'Ogham', 'Runic', 'Tagalog', 'Hanunoo', 'Buhid', 'Tagbanwa', 'Khmer', 'Mongolian', 'Limbu', 'Tai_Le', 'New_Tai_Lue', 'Buginese', 'Tai_Tham', 'Balinese', 'Sundanese', 'Batak', 'Lepcha', 'Ol_Chiki', 'Braille', 'Glagolitic', 'Tifinagh', 'Han', 'Hiragana', 'Katakana', 'Yi', 'Lisu', 'Vai', 'Bamum', 'Syloti_Nagri', 'Phags_Pa', 'Saurashtra', 'Kayah_Li', 'Rejang', 'Javanese', 'Cham', 'Tai_Viet', 'Meetei_Mayek', 'null', 'Linear_B', 'Lycian', 'Carian', 'Old_Italic', 'Gothic', 'Old_Permic', 'Ugaritic', 'Old_Persian', 'Deseret', 'Shavian', 'Osmanya', 'Osage', 'Elbasan', 'Caucasian_Albanian', 'Linear_A', 'Cypriot', 'Imperial_Aramaic', 'Palmyrene', 'Nabataean', 'Hatran', 'Phoenician', 'Lydian', 'Meroitic_Hieroglyphs', 'Meroitic_Cursive', 'Kharoshthi', 'Old_South_Arabian', 'Old_North_Arabian', 'Manichaean', 'Avestan', 'Inscriptional_Parthian', 'Inscriptional_Pahlavi', 'Psalter_Pahlavi', 'Old_Turkic', 'Old_Hungarian', 'Hanifi_Rohingya', 'Old_Sogdian', 'Sogdian', 'Elymaic', 'Brahmi', 'Kaithi', 'Sora_Sompeng', 'Chakma', 'Mahajani', 'Sharada', 'Khojki', 'Multani', 'Khudawadi', 'Grantha', 'Newa', 'Tirhuta', 'Siddham', 'Modi', 'Takri', 'Ahom', 'Dogra', 'Warang_Citi', 'Nandinagari', 'Zanabazar_Square', 'Soyombo', 'Pau_Cin_Hau', 'Bhaiksuki', 'Marchen', 'Masaram_Gondi', 'Gunjala_Gondi', 'Makasar', 'Cuneiform', 'Egyptian_Hieroglyphs', 'Anatolian_Hieroglyphs', 'Mro', 'Bassa_Vah', 'Pahawh_Hmong', 'Medefaidrin', 'Miao', 'Tangut', 'Nushu', 'Duployan', 'SignWriting', 'Nyiakeng_Puachue_Hmong', 'Wancho', 'Mende_Kikakui', 'Adlam'], eaw: ['N', 'Na', 'A', 'W', 'H', 'F'] };\n", "/** @type {string} */\nexport default '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';\n", "import UnicodeTrie from '../unicode-trie/index.js';\nimport data from './data.js';\nimport trieBase64 from './data-trie.js';\n\n/**\n * @param {string} base64\n * @returns {Uint8Array}\n */\nfunction decodeBase64(base64) {\n if (typeof Buffer !== 'undefined') {\n return new Uint8Array(Buffer.from(base64, 'base64'));\n }\n\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\nconst trie = new UnicodeTrie(decodeBase64(trieBase64));\n\n/** @type {(n: number) => number} */\nconst log2 = Math.log2 || (n => Math.log(n) / Math.LN2);\n/**\n * @param {number} n\n * @returns {number}\n */\nconst bits = n => ((log2(n) + 1) | 0);\n\n// compute the number of bits stored for each field\nconst CATEGORY_BITS = bits(data.categories.length - 1);\nconst COMBINING_BITS = bits(data.combiningClasses.length - 1);\nconst SCRIPT_BITS = bits(data.scripts.length - 1);\nconst EAW_BITS = bits(data.eaw.length - 1);\nconst NUMBER_BITS = 10;\n\n// compute shift and mask values for each field\nconst CATEGORY_SHIFT = COMBINING_BITS + SCRIPT_BITS + EAW_BITS + NUMBER_BITS;\nconst COMBINING_SHIFT = SCRIPT_BITS + EAW_BITS + NUMBER_BITS;\nconst SCRIPT_SHIFT = EAW_BITS + NUMBER_BITS;\nconst EAW_SHIFT = NUMBER_BITS;\nconst CATEGORY_MASK = (1 << CATEGORY_BITS) - 1;\nconst COMBINING_MASK = (1 << COMBINING_BITS) - 1;\nconst SCRIPT_MASK = (1 << SCRIPT_BITS) - 1;\nconst EAW_MASK = (1 << EAW_BITS) - 1;\nconst NUMBER_MASK = (1 << NUMBER_BITS) - 1;\n\n/**\n * @param {number} codePoint\n * @returns {string}\n */\nexport function getCategory(codePoint) {\n const val = trie.get(codePoint);\n return data.categories[(val >> CATEGORY_SHIFT) & CATEGORY_MASK];\n}\n\n/**\n * @param {number} codePoint\n * @returns {string}\n */\nexport function getCombiningClass(codePoint) {\n const val = trie.get(codePoint);\n return data.combiningClasses[(val >> COMBINING_SHIFT) & COMBINING_MASK];\n}\n\n/**\n * @param {number} codePoint\n * @returns {string}\n */\nexport function getScript(codePoint) {\n const val = trie.get(codePoint);\n return data.scripts[(val >> SCRIPT_SHIFT) & SCRIPT_MASK];\n}\n\n/**\n * @param {number} codePoint\n * @returns {string}\n */\nexport function getEastAsianWidth(codePoint) {\n const val = trie.get(codePoint);\n return data.eaw[(val >> EAW_SHIFT) & EAW_MASK];\n}\n\n/**\n * @param {number} codePoint\n * @returns {number | null}\n */\nexport function getNumericValue(codePoint) {\n let val = trie.get(codePoint);\n let num = val & NUMBER_MASK;\n\n if (num === 0) {\n return null;\n } else if (num <= 50) {\n return num - 1;\n } else if (num < 0x1e0) {\n const numerator = (num >> 4) - 12;\n const denominator = (num & 0xf) + 1;\n return numerator / denominator;\n } else if (num < 0x300) {\n val = (num >> 5) - 14;\n let exp = (num & 0x1f) + 2;\n\n while (exp > 0) {\n val *= 10;\n exp--;\n }\n return val;\n } else {\n val = (num >> 2) - 0xbf;\n let exp = (num & 3) + 1;\n while (exp > 0) {\n val *= 60;\n exp--;\n }\n return val;\n }\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isAlphabetic(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Lu'\n || category === 'Ll'\n || category === 'Lt'\n || category === 'Lm'\n || category === 'Lo'\n || category === 'Nl'\n );\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isDigit(codePoint) {\n return getCategory(codePoint) === 'Nd';\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isPunctuation(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Pc'\n || category === 'Pd'\n || category === 'Pe'\n || category === 'Pf'\n || category === 'Pi'\n || category === 'Po'\n || category === 'Ps'\n );\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isLowerCase(codePoint) {\n return getCategory(codePoint) === 'Ll';\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isUpperCase(codePoint) {\n return getCategory(codePoint) === 'Lu';\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isTitleCase(codePoint) {\n return getCategory(codePoint) === 'Lt';\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isWhiteSpace(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Zs'\n || category === 'Zl'\n || category === 'Zp'\n );\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isBaseForm(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Nd'\n || category === 'No'\n || category === 'Nl'\n || category === 'Lu'\n || category === 'Ll'\n || category === 'Lt'\n || category === 'Lm'\n || category === 'Lo'\n || category === 'Me'\n || category === 'Mc'\n );\n}\n\n/**\n * @param {number} codePoint\n * @returns {boolean}\n */\nexport function isMark(codePoint) {\n const category = getCategory(codePoint);\n return (\n category === 'Mn'\n || category === 'Me'\n || category === 'Mc'\n );\n}\n\n// Backwards compatibility.\nexport default {\n getCategory,\n getCombiningClass,\n getScript,\n getEastAsianWidth,\n getNumericValue,\n isAlphabetic,\n isDigit,\n isPunctuation,\n isLowerCase,\n isUpperCase,\n isTitleCase,\n isWhiteSpace,\n isBaseForm,\n isMark\n};\n", "import { getCombiningClass } from '../packages/unicode-properties/index.js';\n\n/** @typedef {import('../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../types/fontkit').LayoutGlyph} LayoutGlyph */\n/** @typedef {import('../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n/** @typedef {import('../../types/fontkit').GlyphPositionLike} GlyphPositionLike */\n\n/**\n * This class is used when GPOS does not define 'mark' or 'mkmk' features\n * for positioning marks relative to base glyphs. It uses the unicode\n * combining class property to position marks.\n *\n * Based on code from Harfbuzz, thanks!\n * https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-fallback.cc\n */\nexport default class UnicodeLayoutEngine {\n /**\n * @param {LayoutFont} font\n */\n constructor(font) {\n /** @type {LayoutFont} */\n this.font = font;\n }\n\n /**\n * @param {Array<LayoutGlyph | GlyphInfoLike & { cbox?: import('../../types/fontkit').BBoxLike }>} glyphs\n * @param {GlyphPositionLike[]} positions\n * @returns {GlyphPositionLike[]}\n */\n positionGlyphs(glyphs, positions) {\n // find each base + mark cluster, and position the marks relative to the base\n let clusterStart = 0;\n let clusterEnd = 0;\n for (let index = 0; index < glyphs.length; index++) {\n let glyph = glyphs[index];\n if (glyph.isMark) { // TODO: handle ligatures\n clusterEnd = index;\n } else {\n if (clusterStart !== clusterEnd) {\n this.positionCluster(glyphs, positions, clusterStart, clusterEnd);\n }\n\n clusterStart = clusterEnd = index;\n }\n }\n\n if (clusterStart !== clusterEnd) {\n this.positionCluster(glyphs, positions, clusterStart, clusterEnd);\n }\n\n return positions;\n }\n\n /**\n * @param {Array<LayoutGlyph | (GlyphInfoLike & { cbox?: import('../../types/fontkit').BBoxLike, advanceWidth?: number })>} glyphs\n * @param {GlyphPositionLike[]} positions\n * @param {number} clusterStart\n * @param {number} clusterEnd\n * @returns {void}\n */\n positionCluster(glyphs, positions, clusterStart, clusterEnd) {\n let base = /** @type {LayoutGlyph} */ (glyphs[clusterStart]);\n let baseBox = /** @type {import('../../types/fontkit').BBoxLike} */ (base.cbox).copy();\n\n // adjust bounding box for ligature glyphs\n if (base.codePoints.length > 1) {\n // LTR. TODO: RTL support.\n baseBox.minX += ((base.codePoints.length - 1) * baseBox.width) / base.codePoints.length;\n }\n\n let xOffset = -positions[clusterStart].xAdvance;\n let yOffset = 0;\n let yGap = this.font.unitsPerEm / 16;\n\n // position each of the mark glyphs relative to the base glyph\n for (let index = clusterStart + 1; index <= clusterEnd; index++) {\n let mark = /** @type {LayoutGlyph} */ (glyphs[index]);\n let markBox = /** @type {import('../../types/fontkit').BBoxLike} */ (mark.cbox);\n let position = positions[index];\n\n let combiningClass = this.getCombiningClass(mark.codePoints[0]);\n\n if (combiningClass !== 'Not_Reordered') {\n position.xOffset = position.yOffset = 0;\n\n // x positioning\n switch (combiningClass) {\n case 'Double_Above':\n case 'Double_Below':\n // LTR. TODO: RTL support.\n position.xOffset += baseBox.minX - markBox.width / 2 - markBox.minX;\n break;\n\n case 'Attached_Below_Left':\n case 'Below_Left':\n case 'Above_Left':\n // left align\n position.xOffset += baseBox.minX - markBox.minX;\n break;\n\n case 'Attached_Above_Right':\n case 'Below_Right':\n case 'Above_Right':\n // right align\n position.xOffset += baseBox.maxX - markBox.width - markBox.minX;\n break;\n\n default: // Attached_Below, Attached_Above, Below, Above, other\n // center align\n position.xOffset += baseBox.minX + (baseBox.width - markBox.width) / 2 - markBox.minX;\n }\n\n // y positioning\n switch (combiningClass) {\n case 'Double_Below':\n case 'Below_Left':\n case 'Below':\n case 'Below_Right':\n case 'Attached_Below_Left':\n case 'Attached_Below':\n // add a small gap between the glyphs if they are not attached\n if (combiningClass === 'Attached_Below_Left' || combiningClass === 'Attached_Below') {\n baseBox.minY += yGap;\n }\n\n position.yOffset = -baseBox.minY - markBox.maxY;\n baseBox.minY += markBox.height;\n break;\n\n case 'Double_Above':\n case 'Above_Left':\n case 'Above':\n case 'Above_Right':\n case 'Attached_Above':\n case 'Attached_Above_Right':\n // add a small gap between the glyphs if they are not attached\n if (combiningClass === 'Attached_Above' || combiningClass === 'Attached_Above_Right') {\n baseBox.maxY += yGap;\n }\n\n position.yOffset = baseBox.maxY - markBox.minY;\n baseBox.maxY += markBox.height;\n break;\n }\n\n position.xAdvance = position.yAdvance = 0;\n position.xOffset += xOffset;\n position.yOffset += yOffset;\n } else {\n xOffset -= position.xAdvance;\n yOffset -= position.yAdvance;\n }\n }\n\n return;\n }\n\n /**\n * @param {number} codePoint\n * @returns {string}\n */\n getCombiningClass(codePoint) {\n let combiningClass = getCombiningClass(codePoint);\n\n // Thai / Lao need some per-character work\n if ((codePoint & ~0xff) === 0x0e00) {\n if (combiningClass === 'Not_Reordered') {\n switch (codePoint) {\n case 0x0e31:\n case 0x0e34:\n case 0x0e35:\n case 0x0e36:\n case 0x0e37:\n case 0x0e47:\n case 0x0e4c:\n case 0x0e4d:\n case 0x0e4e:\n return 'Above_Right';\n\n case 0x0eb1:\n case 0x0eb4:\n case 0x0eb5:\n case 0x0eb6:\n case 0x0eb7:\n case 0x0ebb:\n case 0x0ecc:\n case 0x0ecd:\n return 'Above';\n\n case 0x0ebc:\n return 'Below';\n }\n } else if (codePoint === 0x0e3a) { // virama\n return 'Below_Right';\n }\n }\n\n switch (combiningClass) {\n // Hebrew\n\n case 'CCC10': // sheva\n case 'CCC11': // hataf segol\n case 'CCC12': // hataf patah\n case 'CCC13': // hataf qamats\n case 'CCC14': // hiriq\n case 'CCC15': // tsere\n case 'CCC16': // segol\n case 'CCC17': // patah\n case 'CCC18': // qamats\n case 'CCC20': // qubuts\n case 'CCC22': // meteg\n return 'Below';\n\n case 'CCC23': // rafe\n return 'Attached_Above';\n\n case 'CCC24': // shin dot\n return 'Above_Right';\n\n case 'CCC25': // sin dot\n case 'CCC19': // holam\n return 'Above_Left';\n\n case 'CCC26': // point varika\n return 'Above';\n\n case 'CCC21': // dagesh\n break;\n\n // Arabic and Syriac\n\n case 'CCC27': // fathatan\n case 'CCC28': // dammatan\n case 'CCC30': // fatha\n case 'CCC31': // damma\n case 'CCC33': // shadda\n case 'CCC34': // sukun\n case 'CCC35': // superscript alef\n case 'CCC36': // superscript alaph\n return 'Above';\n\n case 'CCC29': // kasratan\n case 'CCC32': // kasra\n return 'Below';\n\n // Thai\n\n case 'CCC103': // sara u / sara uu\n return 'Below_Right';\n\n case 'CCC107': // mai\n return 'Above_Right';\n\n // Lao\n\n case 'CCC118': // sign u / sign uu\n return 'Below';\n\n case 'CCC122': // mai\n return 'Above';\n\n // Tibetan\n\n case 'CCC129': // sign aa\n case 'CCC132': // sign u\n return 'Below';\n\n case 'CCC130': // sign i\n return 'Above';\n }\n\n return combiningClass;\n }\n}\n", "/**\n * Represents a glyph bounding box\n */\nexport default class BBox {\n /**\n * @param {number} [minX]\n * @param {number} [minY]\n * @param {number} [maxX]\n * @param {number} [maxY]\n */\n constructor(minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity) {\n /**\n * The minimum X position in the bounding box\n * @type {number}\n */\n this.minX = minX;\n\n /**\n * The minimum Y position in the bounding box\n * @type {number}\n */\n this.minY = minY;\n\n /**\n * The maxmimum X position in the bounding box\n * @type {number}\n */\n this.maxX = maxX;\n\n /**\n * The maxmimum Y position in the bounding box\n * @type {number}\n */\n this.maxY = maxY;\n }\n\n /**\n * The width of the bounding box\n * @type {number}\n */\n get width() {\n return this.maxX - this.minX;\n }\n\n /**\n * The height of the bounding box\n * @type {number}\n */\n get height() {\n return this.maxY - this.minY;\n }\n\n /**\n * @param {number} x\n * @param {number} y\n * @returns {void}\n */\n addPoint(x, y) {\n if (Math.abs(x) !== Infinity) {\n if (x < this.minX) {\n this.minX = x;\n }\n\n if (x > this.maxX) {\n this.maxX = x;\n }\n }\n\n if (Math.abs(y) !== Infinity) {\n if (y < this.minY) {\n this.minY = y;\n }\n\n if (y > this.maxY) {\n this.maxY = y;\n }\n }\n }\n\n /**\n * @returns {BBox}\n */\n copy() {\n return new BBox(this.minX, this.minY, this.maxX, this.maxY);\n }\n}\n", "import { getScript } from '../packages/unicode-properties/index.js';\n\n/** @typedef {import('../../types/fontkit').TextDirection} TextDirection */\n\n// This maps the Unicode Script property to an OpenType script tag\n// Data from http://www.microsoft.com/typography/otspec/scripttags.htm\n// and http://www.unicode.org/Public/UNIDATA/PropertyValueAliases.txt.\n/** @type {Record<string, string | string[]>} */\nconst UNICODE_SCRIPTS = {\n Caucasian_Albanian: 'aghb',\n Arabic: 'arab',\n Imperial_Aramaic: 'armi',\n Armenian: 'armn',\n Avestan: 'avst',\n Balinese: 'bali',\n Bamum: 'bamu',\n Bassa_Vah: 'bass',\n Batak: 'batk',\n Bengali: ['bng2', 'beng'],\n Bopomofo: 'bopo',\n Brahmi: 'brah',\n Braille: 'brai',\n Buginese: 'bugi',\n Buhid: 'buhd',\n Chakma: 'cakm',\n Canadian_Aboriginal: 'cans',\n Carian: 'cari',\n Cham: 'cham',\n Cherokee: 'cher',\n Coptic: 'copt',\n Cypriot: 'cprt',\n Cyrillic: 'cyrl',\n Devanagari: ['dev2', 'deva'],\n Deseret: 'dsrt',\n Duployan: 'dupl',\n Egyptian_Hieroglyphs: 'egyp',\n Elbasan: 'elba',\n Ethiopic: 'ethi',\n Georgian: 'geor',\n Glagolitic: 'glag',\n Gothic: 'goth',\n Grantha: 'gran',\n Greek: 'grek',\n Gujarati: ['gjr2', 'gujr'],\n Gurmukhi: ['gur2', 'guru'],\n Hangul: 'hang',\n Han: 'hani',\n Hanunoo: 'hano',\n Hebrew: 'hebr',\n Hiragana: 'hira',\n Pahawh_Hmong: 'hmng',\n Katakana_Or_Hiragana: 'hrkt',\n Old_Italic: 'ital',\n Javanese: 'java',\n Kayah_Li: 'kali',\n Katakana: 'kana',\n Kharoshthi: 'khar',\n Khmer: 'khmr',\n Khojki: 'khoj',\n Kannada: ['knd2', 'knda'],\n Kaithi: 'kthi',\n Tai_Tham: 'lana',\n Lao: 'lao ',\n Latin: 'latn',\n Lepcha: 'lepc',\n Limbu: 'limb',\n Linear_A: 'lina',\n Linear_B: 'linb',\n Lisu: 'lisu',\n Lycian: 'lyci',\n Lydian: 'lydi',\n Mahajani: 'mahj',\n Mandaic: 'mand',\n Manichaean: 'mani',\n Mende_Kikakui: 'mend',\n Meroitic_Cursive: 'merc',\n Meroitic_Hieroglyphs: 'mero',\n Malayalam: ['mlm2', 'mlym'],\n Modi: 'modi',\n Mongolian: 'mong',\n Mro: 'mroo',\n Meetei_Mayek: 'mtei',\n Myanmar: ['mym2', 'mymr'],\n Old_North_Arabian: 'narb',\n Nabataean: 'nbat',\n Nko: 'nko ',\n Ogham: 'ogam',\n Ol_Chiki: 'olck',\n Old_Turkic: 'orkh',\n Oriya: ['ory2', 'orya'],\n Osmanya: 'osma',\n Palmyrene: 'palm',\n Pau_Cin_Hau: 'pauc',\n Old_Permic: 'perm',\n Phags_Pa: 'phag',\n Inscriptional_Pahlavi: 'phli',\n Psalter_Pahlavi: 'phlp',\n Phoenician: 'phnx',\n Miao: 'plrd',\n Inscriptional_Parthian: 'prti',\n Rejang: 'rjng',\n Runic: 'runr',\n Samaritan: 'samr',\n Old_South_Arabian: 'sarb',\n Saurashtra: 'saur',\n Shavian: 'shaw',\n Sharada: 'shrd',\n Siddham: 'sidd',\n Khudawadi: 'sind',\n Sinhala: 'sinh',\n Sora_Sompeng: 'sora',\n Sundanese: 'sund',\n Syloti_Nagri: 'sylo',\n Syriac: 'syrc',\n Tagbanwa: 'tagb',\n Takri: 'takr',\n Tai_Le: 'tale',\n New_Tai_Lue: 'talu',\n Tamil: ['tml2', 'taml'],\n Tai_Viet: 'tavt',\n Telugu: ['tel2', 'telu'],\n Tifinagh: 'tfng',\n Tagalog: 'tglg',\n Thaana: 'thaa',\n Thai: 'thai',\n Tibetan: 'tibt',\n Tirhuta: 'tirh',\n Ugaritic: 'ugar',\n Vai: 'vai ',\n Warang_Citi: 'wara',\n Old_Persian: 'xpeo',\n Cuneiform: 'xsux',\n Yi: 'yi ',\n Inherited: 'zinh',\n Common: 'zyyy',\n Unknown: 'zzzz'\n};\n\n/** @type {Record<string, string>} */\nconst OPENTYPE_SCRIPTS = {};\nfor (let script in UNICODE_SCRIPTS) {\n let tag = UNICODE_SCRIPTS[script];\n if (Array.isArray(tag)) {\n for (let t of tag) {\n OPENTYPE_SCRIPTS[t] = script;\n }\n } else {\n OPENTYPE_SCRIPTS[tag] = script;\n }\n}\n\n/**\n * @param {string} script\n * @returns {string | string[] | undefined}\n */\nexport function fromUnicode(script) {\n return UNICODE_SCRIPTS[script];\n}\n\n/**\n * @param {string} tag\n * @returns {string | undefined}\n */\nexport function fromOpenType(tag) {\n return OPENTYPE_SCRIPTS[tag];\n}\n\n/**\n * @param {string} string\n * @returns {string | string[]}\n */\nexport function forString(string) {\n let len = string.length;\n let idx = 0;\n while (idx < len) {\n let code = string.charCodeAt(idx++);\n\n // Check if this is a high surrogate\n if (0xd800 <= code && code <= 0xdbff && idx < len) {\n let next = string.charCodeAt(idx);\n\n // Check if this is a low surrogate\n if (0xdc00 <= next && next <= 0xdfff) {\n idx++;\n code = ((code & 0x3FF) << 10) + (next & 0x3FF) + 0x10000;\n }\n }\n\n let script = getScript(code);\n if (script !== 'Common' && script !== 'Inherited' && script !== 'Unknown') {\n return UNICODE_SCRIPTS[script];\n }\n }\n\n return UNICODE_SCRIPTS.Unknown;\n}\n\n/**\n * @param {number[]} codePoints\n * @returns {string | string[]}\n */\nexport function forCodePoints(codePoints) {\n for (let i = 0; i < codePoints.length; i++) {\n let codePoint = codePoints[i];\n let script = getScript(codePoint);\n if (script !== 'Common' && script !== 'Inherited' && script !== 'Unknown') {\n return UNICODE_SCRIPTS[script];\n }\n }\n\n return UNICODE_SCRIPTS.Unknown;\n}\n\n// The scripts in this map are written from right to left\n/** @type {Record<string, boolean>} */\nconst RTL = {\n arab: true, // Arabic\n hebr: true, // Hebrew\n syrc: true, // Syriac\n thaa: true, // Thaana\n cprt: true, // Cypriot Syllabary\n khar: true, // Kharosthi\n phnx: true, // Phoenician\n 'nko ': true, // N'Ko\n lydi: true, // Lydian\n avst: true, // Avestan\n armi: true, // Imperial Aramaic\n phli: true, // Inscriptional Pahlavi\n prti: true, // Inscriptional Parthian\n sarb: true, // Old South Arabian\n orkh: true, // Old Turkic, Orkhon Runic\n samr: true, // Samaritan\n mand: true, // Mandaic, Mandaean\n merc: true, // Meroitic Cursive\n mero: true, // Meroitic Hieroglyphs\n\n // Unicode 7.0 (not listed on http://www.microsoft.com/typography/otspec/scripttags.htm)\n mani: true, // Manichaean\n mend: true, // Mende Kikakui\n nbat: true, // Nabataean\n narb: true, // Old North Arabian\n palm: true, // Palmyrene\n phlp: true // Psalter Pahlavi\n};\n\n/**\n * @param {string | string[] | null | undefined} script\n * @returns {TextDirection}\n */\nexport function direction(script) {\n let tag = Array.isArray(script) ? script[0] : script;\n if (tag && RTL[tag]) {\n return 'rtl';\n }\n\n return 'ltr';\n}\n", "import BBox from '../glyph/BBox';\nimport * as Script from '../layout/Script';\n\n/**\n * Represents a run of Glyph and GlyphPosition objects.\n * Returned by the font layout method.\n */\nexport default class GlyphRun {\n /**\n * @param {import('../glyph/Glyph').default[]} glyphs\n * @param {import('../../types/fontkit').FeatureInput | null | undefined} features\n * @param {import('../../types/fontkit').ScriptTag | string[] | null | undefined} script\n * @param {import('../../types/fontkit').LanguageTag | null | undefined} language\n * @param {import('../../types/fontkit').TextDirection | null | undefined} direction\n */\n constructor(glyphs, features, script, language, direction) {\n /**\n * An array of Glyph objects in the run\n * @type {import('../glyph/Glyph').default[]}\n */\n this.glyphs = glyphs;\n\n /**\n * An array of GlyphPosition objects for each glyph in the run\n * @type {import('./GlyphPosition').default[] | null}\n */\n this.positions = null;\n\n /**\n * The script that was requested for shaping. This was either passed in or detected automatically.\n * @type {import('../../types/fontkit').ScriptTag | string[] | null | undefined}\n */\n this.script = script;\n\n /**\n * The language requested for shaping, as passed in. If `null`, the default language for the\n * script was used.\n * @type {import('../../types/fontkit').LanguageTag | null}\n */\n this.language = language || null;\n\n /**\n * The direction requested for shaping, as passed in (either ltr or rtl).\n * If `null`, the default direction of the script is used.\n * @type {import('../../types/fontkit').TextDirection}\n */\n this.direction = direction || Script.direction(script);\n\n /**\n * The features requested during shaping. This is a combination of user\n * specified features and features chosen by the shaper.\n * @type {import('../../types/fontkit').FeatureMap}\n */\n this.features = {};\n\n // Convert features to an object\n if (Array.isArray(features)) {\n for (let tag of features) {\n this.features[tag] = true;\n }\n } else if (typeof features === 'object' && features !== null) {\n this.features = features;\n }\n }\n\n /**\n * The total advance width of the run.\n * @type {number}\n */\n get advanceWidth() {\n let width = 0;\n if (!this.positions) {\n return width;\n }\n\n for (let position of this.positions) {\n width += position.xAdvance;\n }\n\n return width;\n }\n\n /**\n * The total advance height of the run.\n * @type {number}\n */\n get advanceHeight() {\n let height = 0;\n if (!this.positions) {\n return height;\n }\n\n for (let position of this.positions) {\n height += position.yAdvance;\n }\n\n return height;\n }\n\n /**\n * The bounding box containing all glyphs in the run.\n * @type {BBox}\n */\n get bbox() {\n let bbox = new BBox();\n if (!this.positions) {\n return bbox;\n }\n\n let x = 0;\n let y = 0;\n for (let index = 0; index < this.glyphs.length; index++) {\n let glyph = this.glyphs[index];\n let p = this.positions[index];\n let b = glyph.bbox;\n\n bbox.addPoint(b.minX + x + p.xOffset, b.minY + y + p.yOffset);\n bbox.addPoint(b.maxX + x + p.xOffset, b.maxY + y + p.yOffset);\n\n x += p.xAdvance;\n y += p.yAdvance;\n }\n\n return bbox;\n }\n}\n", "/**\n * Represents positioning information for a glyph in a GlyphRun.\n */\nexport default class GlyphPosition {\n /**\n * @param {number} [xAdvance]\n * @param {number} [yAdvance]\n * @param {number} [xOffset]\n * @param {number} [yOffset]\n */\n constructor(xAdvance = 0, yAdvance = 0, xOffset = 0, yOffset = 0) {\n /**\n * The amount to move the virtual pen in the X direction after rendering this glyph.\n * @type {number}\n */\n this.xAdvance = xAdvance;\n\n /**\n * The amount to move the virtual pen in the Y direction after rendering this glyph.\n * @type {number}\n */\n this.yAdvance = yAdvance;\n\n /**\n * The offset from the pen position in the X direction at which to render this glyph.\n * @type {number}\n */\n this.xOffset = xOffset;\n\n /**\n * The offset from the pen position in the Y direction at which to render this glyph.\n * @type {number}\n */\n this.yOffset = yOffset;\n }\n}\n", "// see https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html\n// and /System/Library/Frameworks/CoreText.framework/Versions/A/Headers/SFNTLayoutTypes.h on a Mac\n\n/** @typedef {import('../../types/fontkit').FeatureMap} FeatureMap */\n/** @typedef {import('../../types/fontkit').FeatureValue} FeatureValue */\n/** @typedef {import('../../types/fontkit').AATFeatureSettings} AATFeatureSettings */\n\n/**\n * @typedef {{ code: number, exclusive: boolean, [selector: string]: number | boolean }} AATFeatureDef\n */\n\n/** @type {Record<string, AATFeatureDef>} */\nconst features = {\n allTypographicFeatures: {\n code: 0,\n exclusive: false,\n allTypeFeatures: 0\n },\n ligatures: {\n code: 1,\n exclusive: false,\n requiredLigatures: 0,\n commonLigatures: 2,\n rareLigatures: 4,\n // logos: 6\n rebusPictures: 8,\n diphthongLigatures: 10,\n squaredLigatures: 12,\n abbrevSquaredLigatures: 14,\n symbolLigatures: 16,\n contextualLigatures: 18,\n historicalLigatures: 20\n },\n cursiveConnection: {\n code: 2,\n exclusive: true,\n unconnected: 0,\n partiallyConnected: 1,\n cursive: 2\n },\n letterCase: {\n code: 3,\n exclusive: true\n },\n // upperAndLowerCase: 0 # deprecated\n // allCaps: 1 # deprecated\n // allLowerCase: 2 # deprecated\n // smallCaps: 3 # deprecated\n // initialCaps: 4 # deprecated\n // initialCapsAndSmallCaps: 5 # deprecated\n verticalSubstitution: {\n code: 4,\n exclusive: false,\n substituteVerticalForms: 0\n },\n linguisticRearrangement: {\n code: 5,\n exclusive: false,\n linguisticRearrangement: 0\n },\n numberSpacing: {\n code: 6,\n exclusive: true,\n monospacedNumbers: 0,\n proportionalNumbers: 1,\n thirdWidthNumbers: 2,\n quarterWidthNumbers: 3\n },\n smartSwash: {\n code: 8,\n exclusive: false,\n wordInitialSwashes: 0,\n wordFinalSwashes: 2,\n // lineInitialSwashes: 4\n // lineFinalSwashes: 6\n nonFinalSwashes: 8\n },\n diacritics: {\n code: 9,\n exclusive: true,\n showDiacritics: 0,\n hideDiacritics: 1,\n decomposeDiacritics: 2\n },\n verticalPosition: {\n code: 10,\n exclusive: true,\n normalPosition: 0,\n superiors: 1,\n inferiors: 2,\n ordinals: 3,\n scientificInferiors: 4\n },\n fractions: {\n code: 11,\n exclusive: true,\n noFractions: 0,\n verticalFractions: 1,\n diagonalFractions: 2\n },\n overlappingCharacters: {\n code: 13,\n exclusive: false,\n preventOverlap: 0\n },\n typographicExtras: {\n code: 14,\n exclusive: false,\n // hyphensToEmDash: 0\n // hyphenToEnDash: 2\n slashedZero: 4\n },\n // formInterrobang: 6\n // smartQuotes: 8\n // periodsToEllipsis: 10\n mathematicalExtras: {\n code: 15,\n exclusive: false,\n // hyphenToMinus: 0\n // asteristoMultiply: 2\n // slashToDivide: 4\n // inequalityLigatures: 6\n // exponents: 8\n mathematicalGreek: 10\n },\n ornamentSets: {\n code: 16,\n exclusive: true,\n noOrnaments: 0,\n dingbats: 1,\n piCharacters: 2,\n fleurons: 3,\n decorativeBorders: 4,\n internationalSymbols: 5,\n mathSymbols: 6\n },\n characterAlternatives: {\n code: 17,\n exclusive: true,\n noAlternates: 0\n },\n // user defined options\n designComplexity: {\n code: 18,\n exclusive: true,\n designLevel1: 0,\n designLevel2: 1,\n designLevel3: 2,\n designLevel4: 3,\n designLevel5: 4\n },\n styleOptions: {\n code: 19,\n exclusive: true,\n noStyleOptions: 0,\n displayText: 1,\n engravedText: 2,\n illuminatedCaps: 3,\n titlingCaps: 4,\n tallCaps: 5\n },\n characterShape: {\n code: 20,\n exclusive: true,\n traditionalCharacters: 0,\n simplifiedCharacters: 1,\n JIS1978Characters: 2,\n JIS1983Characters: 3,\n JIS1990Characters: 4,\n traditionalAltOne: 5,\n traditionalAltTwo: 6,\n traditionalAltThree: 7,\n traditionalAltFour: 8,\n traditionalAltFive: 9,\n expertCharacters: 10,\n JIS2004Characters: 11,\n hojoCharacters: 12,\n NLCCharacters: 13,\n traditionalNamesCharacters: 14\n },\n numberCase: {\n code: 21,\n exclusive: true,\n lowerCaseNumbers: 0,\n upperCaseNumbers: 1\n },\n textSpacing: {\n code: 22,\n exclusive: true,\n proportionalText: 0,\n monospacedText: 1,\n halfWidthText: 2,\n thirdWidthText: 3,\n quarterWidthText: 4,\n altProportionalText: 5,\n altHalfWidthText: 6\n },\n transliteration: {\n code: 23,\n exclusive: true,\n noTransliteration: 0\n },\n // hanjaToHangul: 1\n // hiraganaToKatakana: 2\n // katakanaToHiragana: 3\n // kanaToRomanization: 4\n // romanizationToHiragana: 5\n // romanizationToKatakana: 6\n // hanjaToHangulAltOne: 7\n // hanjaToHangulAltTwo: 8\n // hanjaToHangulAltThree: 9\n annotation: {\n code: 24,\n exclusive: true,\n noAnnotation: 0,\n boxAnnotation: 1,\n roundedBoxAnnotation: 2,\n circleAnnotation: 3,\n invertedCircleAnnotation: 4,\n parenthesisAnnotation: 5,\n periodAnnotation: 6,\n romanNumeralAnnotation: 7,\n diamondAnnotation: 8,\n invertedBoxAnnotation: 9,\n invertedRoundedBoxAnnotation: 10\n },\n kanaSpacing: {\n code: 25,\n exclusive: true,\n fullWidthKana: 0,\n proportionalKana: 1\n },\n ideographicSpacing: {\n code: 26,\n exclusive: true,\n fullWidthIdeographs: 0,\n proportionalIdeographs: 1,\n halfWidthIdeographs: 2\n },\n unicodeDecomposition: {\n code: 27,\n exclusive: false,\n canonicalComposition: 0,\n compatibilityComposition: 2,\n transcodingComposition: 4\n },\n rubyKana: {\n code: 28,\n exclusive: false,\n // noRubyKana: 0 # deprecated - use rubyKanaOff instead\n // rubyKana: 1 # deprecated - use rubyKanaOn instead\n rubyKana: 2\n },\n CJKSymbolAlternatives: {\n code: 29,\n exclusive: true,\n noCJKSymbolAlternatives: 0,\n CJKSymbolAltOne: 1,\n CJKSymbolAltTwo: 2,\n CJKSymbolAltThree: 3,\n CJKSymbolAltFour: 4,\n CJKSymbolAltFive: 5\n },\n ideographicAlternatives: {\n code: 30,\n exclusive: true,\n noIdeographicAlternatives: 0,\n ideographicAltOne: 1,\n ideographicAltTwo: 2,\n ideographicAltThree: 3,\n ideographicAltFour: 4,\n ideographicAltFive: 5\n },\n CJKVerticalRomanPlacement: {\n code: 31,\n exclusive: true,\n CJKVerticalRomanCentered: 0,\n CJKVerticalRomanHBaseline: 1\n },\n italicCJKRoman: {\n code: 32,\n exclusive: false,\n // noCJKItalicRoman: 0 # deprecated - use CJKItalicRomanOff instead\n // CJKItalicRoman: 1 # deprecated - use CJKItalicRomanOn instead\n CJKItalicRoman: 2\n },\n caseSensitiveLayout: {\n code: 33,\n exclusive: false,\n caseSensitiveLayout: 0,\n caseSensitiveSpacing: 2\n },\n alternateKana: {\n code: 34,\n exclusive: false,\n alternateHorizKana: 0,\n alternateVertKana: 2\n },\n stylisticAlternatives: {\n code: 35,\n exclusive: false,\n noStylisticAlternates: 0,\n stylisticAltOne: 2,\n stylisticAltTwo: 4,\n stylisticAltThree: 6,\n stylisticAltFour: 8,\n stylisticAltFive: 10,\n stylisticAltSix: 12,\n stylisticAltSeven: 14,\n stylisticAltEight: 16,\n stylisticAltNine: 18,\n stylisticAltTen: 20,\n stylisticAltEleven: 22,\n stylisticAltTwelve: 24,\n stylisticAltThirteen: 26,\n stylisticAltFourteen: 28,\n stylisticAltFifteen: 30,\n stylisticAltSixteen: 32,\n stylisticAltSeventeen: 34,\n stylisticAltEighteen: 36,\n stylisticAltNineteen: 38,\n stylisticAltTwenty: 40\n },\n contextualAlternates: {\n code: 36,\n exclusive: false,\n contextualAlternates: 0,\n swashAlternates: 2,\n contextualSwashAlternates: 4\n },\n lowerCase: {\n code: 37,\n exclusive: true,\n defaultLowerCase: 0,\n lowerCaseSmallCaps: 1,\n lowerCasePetiteCaps: 2\n },\n upperCase: {\n code: 38,\n exclusive: true,\n defaultUpperCase: 0,\n upperCaseSmallCaps: 1,\n upperCasePetiteCaps: 2\n },\n languageTag: { // indices into ltag table\n code: 39,\n exclusive: true\n },\n CJKRomanSpacing: {\n code: 103,\n exclusive: true,\n halfWidthCJKRoman: 0,\n proportionalCJKRoman: 1,\n defaultCJKRoman: 2,\n fullWidthCJKRoman: 3\n }\n};\n\n/**\n * @param {string} name\n * @param {string} selector\n * @returns {[number, number]}\n */\nconst feature = (name, selector) => {\n let f = features[name];\n return [(f.code), /** @type {number} */ (f[selector])];\n};\n\n/** @type {Record<string, [number, number]>} */\nconst OTMapping = {\n rlig: feature('ligatures', 'requiredLigatures'),\n clig: feature('ligatures', 'contextualLigatures'),\n dlig: feature('ligatures', 'rareLigatures'),\n hlig: feature('ligatures', 'historicalLigatures'),\n liga: feature('ligatures', 'commonLigatures'),\n hist: feature('ligatures', 'historicalLigatures'), // ??\n\n smcp: feature('lowerCase', 'lowerCaseSmallCaps'),\n pcap: feature('lowerCase', 'lowerCasePetiteCaps'),\n\n frac: feature('fractions', 'diagonalFractions'),\n dnom: feature('fractions', 'diagonalFractions'), // ??\n numr: feature('fractions', 'diagonalFractions'), // ??\n afrc: feature('fractions', 'verticalFractions'),\n // aalt\n // abvf, abvm, abvs, akhn, blwf, blwm, blws, cfar, cjct, cpsp, falt, isol, jalt, ljmo, mset?\n // ltra, ltrm, nukt, pref, pres, pstf, psts, rand, rkrf, rphf, rtla, rtlm, size, tjmo, tnum?\n // unic, vatu, vhal, vjmo, vpal, vrt2\n // dist -> trak table?\n // kern, vkrn -> kern table\n // lfbd + opbd + rtbd -> opbd table?\n // mark, mkmk -> acnt table?\n // locl -> languageTag + ltag table\n\n case: feature('caseSensitiveLayout', 'caseSensitiveLayout'), // also caseSensitiveSpacing\n ccmp: feature('unicodeDecomposition', 'canonicalComposition'), // compatibilityComposition?\n cpct: feature('CJKVerticalRomanPlacement', 'CJKVerticalRomanCentered'), // guess..., probably not given below\n valt: feature('CJKVerticalRomanPlacement', 'CJKVerticalRomanCentered'),\n swsh: feature('contextualAlternates', 'swashAlternates'),\n cswh: feature('contextualAlternates', 'contextualSwashAlternates'),\n curs: feature('cursiveConnection', 'cursive'), // ??\n c2pc: feature('upperCase', 'upperCasePetiteCaps'),\n c2sc: feature('upperCase', 'upperCaseSmallCaps'),\n\n init: feature('smartSwash', 'wordInitialSwashes'), // ??\n fin2: feature('smartSwash', 'wordFinalSwashes'), // ??\n medi: feature('smartSwash', 'nonFinalSwashes'), // ??\n med2: feature('smartSwash', 'nonFinalSwashes'), // ??\n fin3: feature('smartSwash', 'wordFinalSwashes'), // ??\n fina: feature('smartSwash', 'wordFinalSwashes'), // ??\n\n pkna: feature('kanaSpacing', 'proportionalKana'),\n half: feature('textSpacing', 'halfWidthText'), // also HalfWidthCJKRoman, HalfWidthIdeographs?\n halt: feature('textSpacing', 'altHalfWidthText'),\n\n hkna: feature('alternateKana', 'alternateHorizKana'),\n vkna: feature('alternateKana', 'alternateVertKana'),\n // hngl: feature 'transliteration', 'hanjaToHangulSelector' # deprecated\n\n ital: feature('italicCJKRoman', 'CJKItalicRoman'),\n lnum: feature('numberCase', 'upperCaseNumbers'),\n onum: feature('numberCase', 'lowerCaseNumbers'),\n mgrk: feature('mathematicalExtras', 'mathematicalGreek'),\n\n // nalt: not enough info. what type of annotation?\n // ornm: ditto, which ornament style?\n\n calt: feature('contextualAlternates', 'contextualAlternates'), // or more?\n vrt2: feature('verticalSubstitution', 'substituteVerticalForms'), // oh... below?\n vert: feature('verticalSubstitution', 'substituteVerticalForms'),\n tnum: feature('numberSpacing', 'monospacedNumbers'),\n pnum: feature('numberSpacing', 'proportionalNumbers'),\n sups: feature('verticalPosition', 'superiors'),\n subs: feature('verticalPosition', 'inferiors'),\n ordn: feature('verticalPosition', 'ordinals'),\n pwid: feature('textSpacing', 'proportionalText'),\n hwid: feature('textSpacing', 'halfWidthText'),\n qwid: feature('textSpacing', 'quarterWidthText'), // also QuarterWidthNumbers?\n twid: feature('textSpacing', 'thirdWidthText'), // also ThirdWidthNumbers?\n fwid: feature('textSpacing', 'proportionalText'), // ??\n palt: feature('textSpacing', 'altProportionalText'),\n trad: feature('characterShape', 'traditionalCharacters'),\n smpl: feature('characterShape', 'simplifiedCharacters'),\n jp78: feature('characterShape', 'JIS1978Characters'),\n jp83: feature('characterShape', 'JIS1983Characters'),\n jp90: feature('characterShape', 'JIS1990Characters'),\n jp04: feature('characterShape', 'JIS2004Characters'),\n expt: feature('characterShape', 'expertCharacters'),\n hojo: feature('characterShape', 'hojoCharacters'),\n nlck: feature('characterShape', 'NLCCharacters'),\n tnam: feature('characterShape', 'traditionalNamesCharacters'),\n ruby: feature('rubyKana', 'rubyKana'),\n titl: feature('styleOptions', 'titlingCaps'),\n zero: feature('typographicExtras', 'slashedZero'),\n\n ss01: feature('stylisticAlternatives', 'stylisticAltOne'),\n ss02: feature('stylisticAlternatives', 'stylisticAltTwo'),\n ss03: feature('stylisticAlternatives', 'stylisticAltThree'),\n ss04: feature('stylisticAlternatives', 'stylisticAltFour'),\n ss05: feature('stylisticAlternatives', 'stylisticAltFive'),\n ss06: feature('stylisticAlternatives', 'stylisticAltSix'),\n ss07: feature('stylisticAlternatives', 'stylisticAltSeven'),\n ss08: feature('stylisticAlternatives', 'stylisticAltEight'),\n ss09: feature('stylisticAlternatives', 'stylisticAltNine'),\n ss10: feature('stylisticAlternatives', 'stylisticAltTen'),\n ss11: feature('stylisticAlternatives', 'stylisticAltEleven'),\n ss12: feature('stylisticAlternatives', 'stylisticAltTwelve'),\n ss13: feature('stylisticAlternatives', 'stylisticAltThirteen'),\n ss14: feature('stylisticAlternatives', 'stylisticAltFourteen'),\n ss15: feature('stylisticAlternatives', 'stylisticAltFifteen'),\n ss16: feature('stylisticAlternatives', 'stylisticAltSixteen'),\n ss17: feature('stylisticAlternatives', 'stylisticAltSeventeen'),\n ss18: feature('stylisticAlternatives', 'stylisticAltEighteen'),\n ss19: feature('stylisticAlternatives', 'stylisticAltNineteen'),\n ss20: feature('stylisticAlternatives', 'stylisticAltTwenty')\n};\n\n// salt: feature 'stylisticAlternatives', 'stylisticAltOne' # hmm, which one to choose\n\n// Add cv01-cv99 features\nfor (let i = 1; i <= 99; i++) {\n OTMapping[`cv${`00${i}`.slice(-2)}`] = [features.characterAlternatives.code, i];\n}\n\n/** @type {Record<number, Record<number, string>>} */\nlet AATMapping = {};\nfor (let ot in OTMapping) {\n let aat = OTMapping[ot];\n if (AATMapping[aat[0]] == null) {\n AATMapping[aat[0]] = {};\n }\n\n AATMapping[aat[0]][aat[1]] = ot;\n}\n\n/**\n * Maps an OpenType feature map to AAT features\n * in the form of {featureType:{featureSetting:true}}\n * @param {FeatureMap | Record<string, FeatureValue>} features\n * @returns {AATFeatureSettings}\n */\nexport function mapOTToAAT(features) {\n /** @type {AATFeatureSettings} */\n let res = {};\n for (let k in features) {\n let r;\n if ((r = OTMapping[k])) {\n if (res[r[0]] == null) {\n res[r[0]] = {};\n }\n\n res[r[0]][r[1]] = features[k];\n }\n }\n\n return res;\n}\n\n/**\n * @param {string | number} value\n * @returns {value is string}\n */\nfunction isFeatureName(value) {\n return typeof value === 'string' && Number.isNaN(Number(value));\n}\n\n/**\n * Maps strings in a [featureType, featureSetting]\n * to their equivalent number codes\n * @param {[string | number, string | number]} f\n * @returns {[number | undefined, number | undefined]}\n */\nfunction mapFeatureStrings(f) {\n let [type, setting] = f;\n /** @type {number | undefined} */\n let typeCode;\n if (isFeatureName(type)) {\n typeCode = features[type] && /** @type {number} */ (features[type].code);\n } else {\n typeCode = Number(type);\n }\n\n /** @type {number | undefined} */\n let settingCode;\n if (isFeatureName(setting)) {\n let feat = isFeatureName(type) ? features[type] : undefined;\n settingCode = feat ? /** @type {number} */ (feat[setting]) : undefined;\n } else {\n settingCode = Number(setting);\n }\n\n return [typeCode, settingCode];\n}\n\n/**\n * Maps AAT features to an array of OpenType features.\n * Supports both arrays in the form of [[featureType, featureSetting]]\n * and objects in the form of {featureType:{featureSetting:true}}.\n * featureTypes and featureSettings can be either strings or number codes.\n * @param {Array<[string | number, string | number]> | Record<string, Record<string, FeatureValue>>} features\n * @returns {string[]}\n */\nexport function mapAATToOT(features) {\n /** @type {Record<string, true>} */\n let res = {};\n if (Array.isArray(features)) {\n for (let k = 0; k < features.length; k++) {\n let r;\n let f = mapFeatureStrings(features[k]);\n if (f[0] != null && f[1] != null && (r = AATMapping[f[0]] && AATMapping[f[0]][f[1]])) {\n res[r] = true;\n }\n }\n } else if (typeof features === 'object') {\n for (let type in features) {\n let feature = features[type];\n for (let setting in feature) {\n let r;\n let f = mapFeatureStrings([type, setting]);\n if (feature[setting] && f[0] != null && f[1] != null && (r = AATMapping[f[0]] && AATMapping[f[0]][f[1]])) {\n res[r] = true;\n }\n }\n }\n }\n\n return Object.keys(res);\n}\n", "import { cache } from '../decorators';\nimport { range } from '../utils';\n\n/** @typedef {import('../../types/fontkit').AATLookupTableData} AATLookupTableData */\n/** @typedef {import('../../types/fontkit').AATUnboundedArray<number>} AATNumberArray */\n/** @typedef {import('../../types/fontkit').AATLookupSegmentSingle} AATLookupSegmentSingle */\n\nexport default class AATLookupTable {\n /**\n * @param {AATLookupTableData} table\n */\n constructor(table) {\n /** @type {AATLookupTableData} */\n this.table = table;\n }\n\n /**\n * @param {number} glyph\n * @returns {number | null | undefined}\n */\n lookup(glyph) {\n switch (this.table.version) {\n case 0: // simple array format\n return /** @type {AATNumberArray} */ (this.table.values).getItem(glyph);\n\n case 2: // segment format\n case 4: {\n let min = 0;\n let max = this.table.binarySearchHeader.nUnits - 1;\n\n while (min <= max) {\n let mid = (min + max) >> 1;\n let seg = this.table.segments[mid];\n\n // special end of search value\n if (seg.firstGlyph === 0xffff) {\n return null;\n }\n\n if (glyph < seg.firstGlyph) {\n max = mid - 1;\n } else if (glyph > seg.lastGlyph) {\n min = mid + 1;\n } else {\n if (this.table.version === 2) {\n return seg.value;\n } else {\n return seg.values[glyph - seg.firstGlyph];\n }\n }\n }\n\n return null;\n }\n\n case 6: { // lookup single\n let min = 0;\n let max = this.table.binarySearchHeader.nUnits - 1;\n\n while (min <= max) {\n let mid = (min + max) >> 1;\n let seg = this.table.segments[mid];\n\n // special end of search value\n if (seg.glyph === 0xffff) {\n return null;\n }\n\n if (glyph < seg.glyph) {\n max = mid - 1;\n } else if (glyph > seg.glyph) {\n min = mid + 1;\n } else {\n return seg.value;\n }\n }\n\n return null;\n }\n\n case 8: // lookup trimmed\n return /** @type {number[]} */ (this.table.values)[glyph - this.table.firstGlyph];\n\n default:\n throw new Error(`Unknown lookup table format: ${this.table.version}`);\n }\n }\n\n /**\n * @param {number} classValue\n * @returns {number[]}\n */\n @cache\n glyphsForValue(classValue) {\n /** @type {number[]} */\n let res = [];\n\n switch (this.table.version) {\n case 2: // segment format\n case 4: {\n for (let segment of this.table.segments) {\n if ((this.table.version === 2 && segment.value === classValue)) {\n res.push(...range(segment.firstGlyph, segment.lastGlyph + 1));\n } else {\n for (let index = 0; index < segment.values.length; index++) {\n if (segment.values[index] === classValue) {\n res.push(segment.firstGlyph + index);\n }\n }\n }\n }\n\n break;\n }\n\n case 6: { // lookup single\n for (let segment of this.table.segments) {\n if (segment.value === classValue) {\n res.push(segment.glyph);\n }\n }\n\n break;\n }\n\n case 8: { // lookup trimmed\n let values = /** @type {number[]} */ (this.table.values);\n for (let i = 0; i < values.length; i++) {\n if (values[i] === classValue) {\n res.push(this.table.firstGlyph + i);\n }\n }\n\n break;\n }\n\n default:\n throw new Error(`Unknown lookup table format: ${this.table.version}`);\n }\n\n return res;\n }\n}\n", "import AATLookupTable from './AATLookupTable';\n\n/** @typedef {import('../../types/fontkit').AATStateTable} AATStateTable */\n/** @typedef {import('../../types/fontkit').AATStateEntry} AATStateEntry */\n/** @typedef {import('../../types/fontkit').LayoutGlyph} LayoutGlyph */\n\nconst START_OF_TEXT_STATE = 0;\nconst _START_OF_LINE_STATE = 1;\n\nconst END_OF_TEXT_CLASS = 0;\nconst OUT_OF_BOUNDS_CLASS = 1;\nconst DELETED_GLYPH_CLASS = 2;\nconst _END_OF_LINE_CLASS = 3;\n\nconst DONT_ADVANCE = 0x4000;\n\n/**\n * @callback AATProcessEntry\n * @param {LayoutGlyph | null} glyph\n * @param {AATStateEntry} entry\n * @param {number} index\n */\n\n/**\n * @typedef {object} AATTraverseOpts\n * @property {(glyph: number, entry: AATStateEntry) => void} [enter]\n * @property {(glyph: number, entry: AATStateEntry) => void} [exit]\n */\n\nexport default class AATStateMachine {\n /**\n * @param {AATStateTable} stateTable\n */\n constructor(stateTable) {\n /** @type {AATStateTable} */\n this.stateTable = stateTable;\n /** @type {AATLookupTable} */\n this.lookupTable = new AATLookupTable(stateTable.classTable);\n }\n\n /**\n * @param {LayoutGlyph[]} glyphs\n * @param {boolean} reverse\n * @param {AATProcessEntry} processEntry\n * @returns {LayoutGlyph[]}\n */\n process(glyphs, reverse, processEntry) {\n let currentState = START_OF_TEXT_STATE; // START_OF_LINE_STATE is used for kashida glyph insertions sometimes I think?\n let index = reverse ? glyphs.length - 1 : 0;\n let dir = reverse ? -1 : 1;\n\n while ((dir === 1 && index <= glyphs.length) || (dir === -1 && index >= -1)) {\n /** @type {LayoutGlyph | null} */\n let glyph = null;\n let classCode;\n let shouldAdvance = true;\n\n if (index === glyphs.length || index === -1) {\n classCode = END_OF_TEXT_CLASS;\n } else {\n glyph = glyphs[index];\n if (glyph.id === 0xffff) { // deleted glyph\n classCode = DELETED_GLYPH_CLASS;\n } else {\n classCode = this.lookupTable.lookup(glyph.id);\n if (classCode == null) {\n classCode = OUT_OF_BOUNDS_CLASS;\n }\n }\n }\n\n let row = this.stateTable.stateArray.getItem(currentState);\n let entryIndex = row[classCode];\n let entry = this.stateTable.entryTable.getItem(entryIndex);\n\n if (classCode !== END_OF_TEXT_CLASS && classCode !== DELETED_GLYPH_CLASS) {\n processEntry(glyph, entry, index);\n shouldAdvance = !(entry.flags & DONT_ADVANCE);\n }\n\n currentState = entry.newState;\n if (shouldAdvance) {\n index += dir;\n }\n }\n\n return glyphs;\n }\n\n /**\n * Performs a depth-first traversal of the glyph strings\n * represented by the state machine.\n * @param {AATTraverseOpts} opts\n * @param {number} [state]\n * @param {Set<number>} [visited]\n */\n traverse(opts, state = 0, visited = new Set()) {\n if (visited.has(state)) {\n return;\n }\n\n visited.add(state);\n\n let { nClasses, stateArray, entryTable } = this.stateTable;\n let row = stateArray.getItem(state);\n\n // Skip predefined classes\n for (let classCode = 4; classCode < nClasses; classCode++) {\n let entryIndex = row[classCode];\n let entry = entryTable.getItem(entryIndex);\n\n // Try all glyphs in the class\n for (let glyph of this.lookupTable.glyphsForValue(classCode)) {\n if (opts.enter) {\n opts.enter(glyph, entry);\n }\n\n if (entry.newState !== 0) {\n this.traverse(opts, entry.newState, visited);\n }\n\n if (opts.exit) {\n opts.exit(glyph, entry);\n }\n }\n }\n }\n}\n", "import AATStateMachine from './AATStateMachine';\nimport AATLookupTable from './AATLookupTable';\nimport { cache } from '../decorators';\n\n/** @typedef {import('../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../types/fontkit').LayoutGlyph} LayoutGlyph */\n/** @typedef {import('../../types/fontkit').MorxTable} MorxTable */\n/** @typedef {import('../../types/fontkit').MorxSubtable} MorxSubtable */\n/** @typedef {import('../../types/fontkit').AATStateEntry} AATStateEntry */\n/** @typedef {import('../../types/fontkit').AATFeatureSettings} AATFeatureSettings */\n/** @typedef {import('../../types/fontkit').FeatureValue} FeatureValue */\n\n// indic replacement flags\nconst MARK_FIRST = 0x8000;\nconst MARK_LAST = 0x2000;\nconst VERB = 0x000F;\n\n// contextual substitution and glyph insertion flag\nconst SET_MARK = 0x8000;\n\n// ligature entry flags\nconst SET_COMPONENT = 0x8000;\nconst PERFORM_ACTION = 0x2000;\n\n// ligature action masks\nconst LAST_MASK = 0x80000000;\nconst STORE_MASK = 0x40000000;\nconst OFFSET_MASK = 0x3FFFFFFF;\n\nconst _VERTICAL_ONLY = 0x800000;\nconst REVERSE_DIRECTION = 0x400000;\nconst _HORIZONTAL_AND_VERTICAL = 0x200000;\n\n// glyph insertion flags\nconst _CURRENT_IS_KASHIDA_LIKE = 0x2000;\nconst _MARKED_IS_KASHIDA_LIKE = 0x1000;\nconst CURRENT_INSERT_BEFORE = 0x0800;\nconst MARKED_INSERT_BEFORE = 0x0400;\nconst CURRENT_INSERT_COUNT = 0x03E0;\nconst MARKED_INSERT_COUNT = 0x001F;\n\n/**\n * @typedef {[number, number]} GlyphRange\n */\n\nexport default class AATMorxProcessor {\n /**\n * @param {LayoutFont} font\n */\n constructor(font) {\n this.processIndicRearragement = this.processIndicRearragement.bind(this);\n this.processContextualSubstitution = this.processContextualSubstitution.bind(this);\n this.processLigature = this.processLigature.bind(this);\n this.processNoncontextualSubstitutions = this.processNoncontextualSubstitutions.bind(this);\n this.processGlyphInsertion = this.processGlyphInsertion.bind(this);\n /** @type {LayoutFont} */\n this.font = font;\n /** @type {MorxTable} */\n this.morx = /** @type {MorxTable} */ (font.morx);\n /** @type {Record<number, number[][]> | null} */\n this.inputCache = null;\n /** @type {MorxSubtable | undefined} */\n this.subtable = undefined;\n /** @type {LayoutGlyph[]} */\n this.glyphs = [];\n /** @type {number[]} */\n this.ligatureStack = [];\n /** @type {number | null} */\n this.markedGlyph = null;\n /** @type {number | null} */\n this.firstGlyph = null;\n /** @type {number | null} */\n this.lastGlyph = null;\n /** @type {number | null} */\n this.markedIndex = null;\n }\n\n /**\n * Processes an array of glyphs and applies the specified features.\n * Features should be in the form of {featureType:{featureSetting:boolean}}\n * @param {LayoutGlyph[]} glyphs\n * @param {AATFeatureSettings | Record<number, Record<number, FeatureValue>>} [features]\n * @returns {LayoutGlyph[]}\n */\n process(glyphs, features = {}) {\n for (let chain of this.morx.chains) {\n let flags = chain.defaultFlags;\n\n // enable/disable the requested features\n for (let feature of chain.features) {\n let f;\n if ((f = features[feature.featureType])) {\n if (f[feature.featureSetting]) {\n flags &= feature.disableFlags;\n flags |= feature.enableFlags;\n } else if (f[feature.featureSetting] === false) {\n flags |= ~feature.disableFlags;\n flags &= ~feature.enableFlags;\n }\n }\n }\n\n for (let subtable of chain.subtables) {\n if (subtable.subFeatureFlags & flags) {\n this.processSubtable(subtable, glyphs);\n }\n }\n }\n\n // remove deleted glyphs\n let index = glyphs.length - 1;\n while (index >= 0) {\n if (glyphs[index].id === 0xffff) {\n glyphs.splice(index, 1);\n }\n\n index--;\n }\n\n return glyphs;\n }\n\n /**\n * @param {MorxSubtable} subtable\n * @param {LayoutGlyph[]} glyphs\n * @returns {LayoutGlyph[] | void}\n */\n processSubtable(subtable, glyphs) {\n this.subtable = subtable;\n this.glyphs = glyphs;\n if (this.subtable.type === 4) {\n this.processNoncontextualSubstitutions(this.subtable, this.glyphs);\n return;\n }\n\n this.ligatureStack = [];\n this.markedGlyph = null;\n this.firstGlyph = null;\n this.lastGlyph = null;\n this.markedIndex = null;\n\n let stateMachine = this.getStateMachine(subtable);\n let process = this.getProcessor();\n\n let reverse = !!(this.subtable.coverage & REVERSE_DIRECTION);\n return stateMachine.process(this.glyphs, reverse, process);\n }\n\n /**\n * @param {MorxSubtable} subtable\n * @returns {AATStateMachine}\n */\n @cache\n getStateMachine(subtable) {\n return new AATStateMachine(/** @type {import('../../types/fontkit').AATStateTable} */ (subtable.table.stateTable));\n }\n\n /**\n * @returns {(glyph: LayoutGlyph | null, entry: AATStateEntry, index: number) => void}\n */\n getProcessor() {\n switch (/** @type {MorxSubtable} */ (this.subtable).type) {\n case 0:\n return this.processIndicRearragement;\n case 1:\n return this.processContextualSubstitution;\n case 2:\n return this.processLigature;\n case 5:\n return this.processGlyphInsertion;\n default:\n throw new Error(`Invalid morx subtable type: ${/** @type {MorxSubtable} */ (this.subtable).type}`);\n }\n }\n\n /**\n * @param {LayoutGlyph | null} glyph\n * @param {AATStateEntry} entry\n * @param {number} index\n */\n processIndicRearragement(glyph, entry, index) {\n if (entry.flags & MARK_FIRST) {\n this.firstGlyph = index;\n }\n\n if (entry.flags & MARK_LAST) {\n this.lastGlyph = index;\n }\n\n reorderGlyphs(this.glyphs, entry.flags & VERB, this.firstGlyph, this.lastGlyph);\n }\n\n /**\n * @param {LayoutGlyph | null} glyph\n * @param {AATStateEntry} entry\n * @param {number} index\n */\n processContextualSubstitution(glyph, entry, index) {\n let subtable = /** @type {MorxSubtable} */ (this.subtable);\n let subsitutions = subtable.table.substitutionTable.items;\n if (entry.markIndex !== 0xffff) {\n let lookup = subsitutions.getItem(/** @type {number} */ (entry.markIndex));\n let lookupTable = new AATLookupTable(lookup);\n glyph = this.glyphs[/** @type {number} */ (this.markedGlyph)];\n let gid = lookupTable.lookup(glyph.id);\n if (gid) {\n let substituted = this.font.getGlyph(gid, glyph.codePoints);\n if (substituted) {\n this.glyphs[/** @type {number} */ (this.markedGlyph)] = substituted;\n }\n }\n }\n\n if (entry.currentIndex !== 0xffff) {\n let lookup = subsitutions.getItem(/** @type {number} */ (entry.currentIndex));\n let lookupTable = new AATLookupTable(lookup);\n glyph = this.glyphs[index];\n let gid = lookupTable.lookup(glyph.id);\n if (gid) {\n let substituted = this.font.getGlyph(gid, glyph.codePoints);\n if (substituted) {\n this.glyphs[index] = substituted;\n }\n }\n }\n\n if (entry.flags & SET_MARK) {\n this.markedGlyph = index;\n }\n }\n\n /**\n * @param {LayoutGlyph | null} glyph\n * @param {AATStateEntry} entry\n * @param {number} index\n */\n processLigature(glyph, entry, index) {\n if (entry.flags & SET_COMPONENT) {\n this.ligatureStack.push(index);\n }\n\n if (entry.flags & PERFORM_ACTION) {\n let subtable = /** @type {MorxSubtable} */ (this.subtable);\n let actions = subtable.table.ligatureActions;\n let components = subtable.table.components;\n let ligatureList = subtable.table.ligatureList;\n\n let actionIndex = /** @type {number} */ (entry.action);\n let last = false;\n let ligatureIndex = 0;\n /** @type {number[]} */\n let codePoints = [];\n /** @type {number[]} */\n let ligatureGlyphs = [];\n\n while (!last) {\n let componentGlyph = this.ligatureStack.pop();\n codePoints.unshift(...this.glyphs[/** @type {number} */ (componentGlyph)].codePoints);\n\n let action = actions.getItem(actionIndex++);\n last = !!(action & LAST_MASK);\n let store = !!(action & STORE_MASK);\n let offset = (action & OFFSET_MASK) << 2 >> 2; // sign extend 30 to 32 bits\n offset += this.glyphs[/** @type {number} */ (componentGlyph)].id;\n\n let component = components.getItem(offset);\n ligatureIndex += component;\n\n if (last || store) {\n let ligatureEntry = ligatureList.getItem(ligatureIndex);\n let ligature = this.font.getGlyph(ligatureEntry, codePoints);\n if (ligature) {\n this.glyphs[/** @type {number} */ (componentGlyph)] = ligature;\n }\n ligatureGlyphs.push(/** @type {number} */ (componentGlyph));\n ligatureIndex = 0;\n codePoints = [];\n } else {\n let deleted = this.font.getGlyph(0xffff);\n if (deleted) {\n this.glyphs[/** @type {number} */ (componentGlyph)] = deleted;\n }\n }\n }\n\n // Put ligature glyph indexes back on the stack\n this.ligatureStack.push(...ligatureGlyphs);\n }\n }\n\n /**\n * @param {MorxSubtable} subtable\n * @param {LayoutGlyph[]} glyphs\n * @param {number} [index]\n */\n processNoncontextualSubstitutions(subtable, glyphs, index) {\n let lookupTable = new AATLookupTable(/** @type {import('../../types/fontkit').AATLookupTableData} */ (subtable.table.lookupTable));\n\n for (index = 0; index < glyphs.length; index++) {\n let glyph = glyphs[index];\n if (glyph.id !== 0xffff) {\n let gid = lookupTable.lookup(glyph.id);\n if (gid) { // 0 means do nothing\n let substituted = this.font.getGlyph(gid, glyph.codePoints);\n if (substituted) {\n glyphs[index] = substituted;\n }\n }\n }\n }\n }\n\n /**\n * @param {number} glyphIndex\n * @param {number} insertionActionIndex\n * @param {number} count\n * @param {boolean} isBefore\n */\n _insertGlyphs(glyphIndex, insertionActionIndex, count, isBefore) {\n /** @type {LayoutGlyph[]} */\n let insertions = [];\n let subtable = /** @type {MorxSubtable} */ (this.subtable);\n while (count--) {\n let gid = subtable.table.insertionActions.getItem(insertionActionIndex++);\n let inserted = this.font.getGlyph(gid);\n if (inserted) {\n insertions.push(inserted);\n }\n }\n\n if (!isBefore) {\n glyphIndex++;\n }\n\n this.glyphs.splice(glyphIndex, 0, ...insertions);\n }\n\n /**\n * @param {LayoutGlyph | null} glyph\n * @param {AATStateEntry} entry\n * @param {number} index\n */\n processGlyphInsertion(glyph, entry, index) {\n if (entry.flags & SET_MARK) {\n this.markedIndex = index;\n }\n\n if (entry.markedInsertIndex !== 0xffff) {\n let count = (entry.flags & MARKED_INSERT_COUNT) >>> 5;\n let isBefore = !!(entry.flags & MARKED_INSERT_BEFORE);\n this._insertGlyphs(/** @type {number} */ (this.markedIndex), /** @type {number} */ (entry.markedInsertIndex), count, isBefore);\n }\n\n if (entry.currentInsertIndex !== 0xffff) {\n let count = (entry.flags & CURRENT_INSERT_COUNT) >>> 5;\n let isBefore = !!(entry.flags & CURRENT_INSERT_BEFORE);\n this._insertGlyphs(index, /** @type {number} */ (entry.currentInsertIndex), count, isBefore);\n }\n }\n\n /**\n * @returns {Array<[number, number]>}\n */\n getSupportedFeatures() {\n /** @type {Array<[number, number]>} */\n let features = [];\n for (let chain of this.morx.chains) {\n for (let feature of chain.features) {\n features.push([feature.featureType, feature.featureSetting]);\n }\n }\n\n return features;\n }\n\n /**\n * @param {number} gid\n * @returns {number[][]}\n */\n generateInputs(gid) {\n if (!this.inputCache) {\n this.generateInputCache();\n }\n\n return /** @type {Record<number, number[][]>} */ (this.inputCache)[gid] || [];\n }\n\n generateInputCache() {\n this.inputCache = {};\n\n for (let chain of this.morx.chains) {\n let flags = chain.defaultFlags;\n\n for (let subtable of chain.subtables) {\n if (subtable.subFeatureFlags & flags) {\n this.generateInputsForSubtable(subtable);\n }\n }\n }\n }\n\n /**\n * @param {MorxSubtable} subtable\n */\n generateInputsForSubtable(subtable) {\n // Currently, only supporting ligature subtables.\n if (subtable.type !== 2) {\n return;\n }\n\n let reverse = !!(subtable.coverage & REVERSE_DIRECTION);\n if (reverse) {\n throw new Error('Reverse subtable, not supported.');\n }\n\n this.subtable = subtable;\n this.ligatureStack = [];\n\n let stateMachine = this.getStateMachine(subtable);\n let process = this.getProcessor();\n\n /** @type {LayoutGlyph[]} */\n let input = [];\n /** @type {Array<{ glyphs: LayoutGlyph[], ligatureStack: number[] }>} */\n let stack = [];\n this.glyphs = [];\n\n stateMachine.traverse({\n enter: (glyph, entry) => {\n let glyphs = this.glyphs;\n stack.push({\n glyphs: glyphs.slice(),\n ligatureStack: this.ligatureStack.slice()\n });\n\n // Add glyph to input and glyphs to process.\n let g = this.font.getGlyph(glyph);\n if (!g) {\n return;\n }\n input.push(g);\n glyphs.push(g);\n\n // Process ligature substitution\n process(glyphs[glyphs.length - 1], entry, glyphs.length - 1);\n\n // Add input to result if only one matching (non-deleted) glyph remains.\n let count = 0;\n let found = 0;\n for (let i = 0; i < glyphs.length && count <= 1; i++) {\n if (glyphs[i].id !== 0xffff) {\n count++;\n found = glyphs[i].id;\n }\n }\n\n if (count === 1) {\n let result = input.map(g => g.id);\n let cacheMap = /** @type {Record<number, number[][]>} */ (this.inputCache);\n let cache = cacheMap[found];\n if (cache) {\n cache.push(result);\n } else {\n cacheMap[found] = [result];\n }\n }\n },\n\n exit: () => {\n ({ glyphs: this.glyphs, ligatureStack: this.ligatureStack } = /** @type {{ glyphs: LayoutGlyph[], ligatureStack: number[] }} */ (stack.pop()));\n input.pop();\n }\n });\n }\n}\n\n/**\n * swaps the glyphs in rangeA with those in rangeB\n * reverse the glyphs inside those ranges if specified\n * ranges are in [offset, length] format\n * @param {LayoutGlyph[]} glyphs\n * @param {GlyphRange} rangeA\n * @param {GlyphRange} rangeB\n * @param {boolean} [reverseA]\n * @param {boolean} [reverseB]\n * @returns {LayoutGlyph[]}\n */\nfunction swap(glyphs, rangeA, rangeB, reverseA = false, reverseB = false) {\n let end = glyphs.splice(rangeB[0] - (rangeB[1] - 1), rangeB[1]);\n if (reverseB) {\n end.reverse();\n }\n\n let start = glyphs.splice(rangeA[0], rangeA[1], ...end);\n if (reverseA) {\n start.reverse();\n }\n\n glyphs.splice(rangeB[0] - (rangeA[1] - 1), 0, ...start);\n return glyphs;\n}\n\n/**\n * @param {LayoutGlyph[]} glyphs\n * @param {number} verb\n * @param {number | null} firstGlyph\n * @param {number | null} lastGlyph\n * @returns {LayoutGlyph[]}\n */\nfunction reorderGlyphs(glyphs, verb, firstGlyph, lastGlyph) {\n let first = /** @type {number} */ (firstGlyph);\n let last = /** @type {number} */ (lastGlyph);\n\n switch (verb) {\n case 0: // no change\n return glyphs;\n\n case 1: // Ax => xA\n return swap(glyphs, [first, 1], [last, 0]);\n\n case 2: // xD => Dx\n return swap(glyphs, [first, 0], [last, 1]);\n\n case 3: // AxD => DxA\n return swap(glyphs, [first, 1], [last, 1]);\n\n case 4: // ABx => xAB\n return swap(glyphs, [first, 2], [last, 0]);\n\n case 5: // ABx => xBA\n return swap(glyphs, [first, 2], [last, 0], true, false);\n\n case 6: // xCD => CDx\n return swap(glyphs, [first, 0], [last, 2]);\n\n case 7: // xCD => DCx\n return swap(glyphs, [first, 0], [last, 2], false, true);\n\n case 8: // AxCD => CDxA\n return swap(glyphs, [first, 1], [last, 2]);\n\n case 9: // AxCD => DCxA\n return swap(glyphs, [first, 1], [last, 2], false, true);\n\n case 10: // ABxD => DxAB\n return swap(glyphs, [first, 2], [last, 1]);\n\n case 11: // ABxD => DxBA\n return swap(glyphs, [first, 2], [last, 1], true, false);\n\n case 12: // ABxCD => CDxAB\n return swap(glyphs, [first, 2], [last, 2]);\n\n case 13: // ABxCD => CDxBA\n return swap(glyphs, [first, 2], [last, 2], true, false);\n\n case 14: // ABxCD => DCxAB\n return swap(glyphs, [first, 2], [last, 2], false, true);\n\n case 15: // ABxCD => DCxBA\n return swap(glyphs, [first, 2], [last, 2], true, true);\n\n default:\n throw new Error(`Unknown verb: ${verb}`);\n }\n}\n", "import * as AATFeatureMap from './AATFeatureMap';\nimport AATMorxProcessor from './AATMorxProcessor';\n\n/** @typedef {import('../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../types/fontkit').GlyphRunLike} GlyphRunLike */\n/** @typedef {import('../../types/fontkit').ScriptTag} ScriptTag */\n/** @typedef {import('../../types/fontkit').LanguageTag} LanguageTag */\n\nexport default class AATLayoutEngine {\n /**\n * @param {LayoutFont} font\n */\n constructor(font) {\n /** @type {LayoutFont} */\n this.font = font;\n /** @type {AATMorxProcessor} */\n this.morxProcessor = new AATMorxProcessor(font);\n /** @type {boolean} */\n this.fallbackPosition = false;\n }\n\n /**\n * @param {GlyphRunLike} glyphRun\n */\n substitute(glyphRun) {\n // AAT expects the glyphs to be in visual order prior to morx processing,\n // so reverse the glyphs if the script is right-to-left.\n if (glyphRun.direction === 'rtl') {\n glyphRun.glyphs.reverse();\n }\n\n this.morxProcessor.process(\n /** @type {import('../../types/fontkit').LayoutGlyph[]} */ (glyphRun.glyphs),\n AATFeatureMap.mapOTToAAT(glyphRun.features)\n );\n }\n\n /**\n * @param {ScriptTag | string[] | null | undefined} [_script]\n * @param {LanguageTag | null | undefined} [_language]\n * @returns {string[]}\n */\n getAvailableFeatures(_script, _language) {\n return AATFeatureMap.mapAATToOT(this.morxProcessor.getSupportedFeatures());\n }\n\n /**\n * @param {number} gid\n * @returns {Set<string>}\n */\n stringsForGlyph(gid) {\n let glyphStrings = this.morxProcessor.generateInputs(gid);\n let result = new Set();\n\n for (let glyphs of glyphStrings) {\n this._addStrings(glyphs, 0, result, '');\n }\n\n return result;\n }\n\n /**\n * @param {number[]} glyphs\n * @param {number} index\n * @param {Set<string>} strings\n * @param {string} string\n */\n _addStrings(glyphs, index, strings, string) {\n let codePoints = this.font._cmapProcessor.codePointsForGlyph(glyphs[index]);\n\n for (let codePoint of codePoints) {\n let s = string + String.fromCodePoint(codePoint);\n if (index < glyphs.length - 1) {\n this._addStrings(glyphs, index + 1, strings, s);\n } else {\n strings.add(s);\n }\n }\n }\n}\n", "/**\n * ShapingPlans are used by the OpenType shapers to store which\n * features should by applied, and in what order to apply them.\n * The features are applied in groups called stages. A feature\n * can be applied globally to all glyphs, or locally to only\n * specific glyphs.\n *\n * @private\n */\n\n/** @typedef {import('../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../types/fontkit').ScriptTag} ScriptTag */\n/** @typedef {import('../../types/fontkit').TextDirection} TextDirection */\n/** @typedef {import('../../types/fontkit').FeatureMap} FeatureMap */\n/** @typedef {import('../../types/fontkit').FeatureInput} FeatureInput */\n/** @typedef {import('../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n/** @typedef {import('../../types/fontkit').GlyphPositionLike} GlyphPositionLike */\n/** @typedef {import('../../types/fontkit').ShapingStage} ShapingStage */\n/** @typedef {import('../../types/fontkit').ShapingStageFn} ShapingStageFn */\n/** @typedef {import('./OTProcessor').default} OTProcessor */\n\n/**\n * @typedef {{ global?: string[], local?: string[] }} FeatureStagesArg\n */\n\nexport default class ShapingPlan {\n /**\n * @param {LayoutFont} font\n * @param {ScriptTag | string[] | null | undefined} script\n * @param {TextDirection} direction\n */\n constructor(font, script, direction) {\n /** @type {LayoutFont} */\n this.font = font;\n /** @type {ScriptTag | string[] | null | undefined} */\n this.script = script;\n /** @type {TextDirection} */\n this.direction = direction;\n /** @type {ShapingStage[]} */\n this.stages = [];\n /** @type {FeatureMap} */\n this.globalFeatures = {};\n /** @type {Record<string, number>} */\n this.allFeatures = {};\n /** @type {FeatureMap | null} */\n this.userFeatures = null; // original user feature values (for Type 3 alternate index)\n /** @type {ScriptTag | string[] | null | undefined} */\n this.bufferScript = undefined;\n }\n\n /**\n * Adds the given features to the last stage.\n * Already-planned tags are not duplicated, but a global add still promotes them.\n * @param {string[]} features\n * @param {boolean} global\n */\n _addFeatures(features, global) {\n let stageIndex = this.stages.length - 1;\n let stage = this.stages[stageIndex];\n if (!Array.isArray(stage)) {\n return;\n }\n for (let feature of features) {\n if (this.allFeatures[feature] == null) {\n stage.push(feature);\n this.allFeatures[feature] = stageIndex;\n }\n\n if (global) {\n this.globalFeatures[feature] = true;\n }\n }\n }\n\n /**\n * Add features to the last stage\n * @param {string | string[] | FeatureStagesArg} arg\n * @param {boolean} [global]\n */\n add(arg, global = true) {\n if (this.stages.length === 0) {\n this.stages.push([]);\n }\n\n if (typeof arg === 'string') {\n arg = [arg];\n }\n\n if (Array.isArray(arg)) {\n this._addFeatures(arg, global);\n } else if (typeof arg === 'object' && arg !== null) {\n this._addFeatures(arg.global || [], true);\n this._addFeatures(arg.local || [], false);\n } else {\n throw new Error('Unsupported argument to ShapingPlan#add');\n }\n }\n\n /**\n * Add a new stage\n * @param {string | string[] | FeatureStagesArg | ShapingStageFn} arg\n * @param {boolean} [global]\n */\n addStage(arg, global) {\n if (typeof arg === 'function') {\n this.stages.push(arg, []);\n } else {\n this.stages.push([]);\n this.add(arg, global);\n }\n }\n\n /**\n * @param {FeatureInput | null | undefined} features\n */\n setFeatureOverrides(features) {\n if (Array.isArray(features)) {\n this.add(features);\n } else if (typeof features === 'object' && features !== null) {\n this.userFeatures = features;\n for (let tag in features) {\n if (features[tag]) {\n this.add(tag);\n } else if (this.allFeatures[tag] != null) {\n let stage = this.stages[this.allFeatures[tag]];\n if (Array.isArray(stage)) {\n stage.splice(stage.indexOf(tag), 1);\n }\n delete this.allFeatures[tag];\n delete this.globalFeatures[tag];\n }\n }\n }\n }\n\n /**\n * Assigns the global features to the given glyphs\n * @param {GlyphInfoLike[]} glyphs\n */\n assignGlobalFeatures(glyphs) {\n for (let glyph of glyphs) {\n for (let feature in this.globalFeatures) {\n glyph.features[feature] = true;\n }\n }\n }\n\n /**\n * Executes the planned stages using the given OTProcessor\n * @param {OTProcessor} processor\n * @param {GlyphInfoLike[]} glyphs\n * @param {GlyphPositionLike[] | null | undefined} [positions]\n */\n process(processor, glyphs, positions) {\n // Preserve original user values (e.g. { aalt: 2 }) for GSUB Type 3.\n processor.userFeatures = this.userFeatures;\n\n for (let stage of this.stages) {\n if (typeof stage === 'function') {\n if (!positions) {\n stage(this.font, glyphs, this);\n }\n } else if (stage.length > 0) {\n processor.applyFeatures(stage, glyphs, positions);\n }\n }\n }\n}\n", "/** @typedef {import('../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n/** @typedef {import('../../types/fontkit').GlyphIteratorOptions} GlyphIteratorOptions */\n/** @typedef {import('../../types/fontkit').LookupFlags} LookupFlags */\n/** @typedef {import('../../types/fontkit').MarkFilteringSet} MarkFilteringSet */\n\nexport default class GlyphIterator {\n /**\n * @param {GlyphInfoLike[]} glyphs\n * @param {GlyphIteratorOptions} [options]\n */\n constructor(glyphs, options) {\n /** @type {GlyphInfoLike[]} */\n this.glyphs = glyphs;\n this.reset(options);\n }\n\n /**\n * @param {GlyphIteratorOptions} [options]\n * @param {number} [index]\n * @param {MarkFilteringSet | null} [markFilteringSet]\n */\n reset(options = {}, index = 0, markFilteringSet = null) {\n /** @type {GlyphIteratorOptions} */\n this.options = options;\n /** @type {LookupFlags} */\n this.flags = options.flags || {};\n /** @type {number} */\n this.markAttachmentType = options.markAttachmentType || 0;\n /** @type {MarkFilteringSet | null} */\n this.markFilteringSet = markFilteringSet;\n /** @type {number} */\n this.index = index;\n }\n\n /**\n * @returns {GlyphInfoLike | null}\n */\n get cur() {\n return this.glyphs[this.index] || null;\n }\n\n /**\n * @param {GlyphInfoLike} glyph\n * @returns {boolean}\n */\n shouldIgnore(glyph) {\n // Mark skip hierarchy (OT chapter 2): ignoreMarks > mark filtering set > markAttachmentType.\n if (glyph.isMark) {\n if (this.flags.ignoreMarks) {\n return true;\n }\n if (this.flags.useMarkFilteringSet) {\n return !this.markFilteringSet?.has(glyph.id);\n }\n if (this.markAttachmentType) {\n return glyph.markAttachmentType !== this.markAttachmentType;\n }\n }\n\n return !!(this.flags.ignoreBaseGlyphs && glyph.isBase)\n || !!(this.flags.ignoreLigatures && glyph.isLigature);\n }\n\n /**\n * @param {number} dir\n * @returns {GlyphInfoLike | null}\n */\n move(dir) {\n this.index += dir;\n while (0 <= this.index && this.index < this.glyphs.length && this.shouldIgnore(this.glyphs[this.index])) {\n this.index += dir;\n }\n\n if (0 > this.index || this.index >= this.glyphs.length) {\n return null;\n }\n\n return this.glyphs[this.index];\n }\n\n /**\n * @returns {GlyphInfoLike | null}\n */\n next() {\n return this.move(+1);\n }\n\n /**\n * @returns {GlyphInfoLike | null}\n */\n prev() {\n return this.move(-1);\n }\n\n /**\n * @param {number} [count]\n * @returns {GlyphInfoLike | undefined}\n */\n peek(count = 1) {\n let idx = this.index;\n let res = this.increment(count);\n this.index = idx;\n return res;\n }\n\n /**\n * @param {number} [count]\n * @returns {number}\n */\n peekIndex(count = 1) {\n let idx = this.index;\n this.increment(count);\n let res = this.index;\n this.index = idx;\n return res;\n }\n\n /**\n * @param {number} [count]\n * @returns {GlyphInfoLike | undefined}\n */\n increment(count = 1) {\n let dir = count < 0 ? -1 : 1;\n count = Math.abs(count);\n while (count--) {\n this.move(dir);\n }\n\n return this.glyphs[this.index];\n }\n}\n", "import GlyphIterator from './GlyphIterator';\nimport * as Script from '../layout/Script';\n\n/** @typedef {import('../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../types/fontkit').OTLayoutTable} OTLayoutTable */\n/** @typedef {import('../../types/fontkit').OTScriptRecord} OTScriptRecord */\n/** @typedef {import('../../types/fontkit').OTScript} OTScript */\n/** @typedef {import('../../types/fontkit').OTLangSys} OTLangSys */\n/** @typedef {import('../../types/fontkit').OTFeature} OTFeature */\n/** @typedef {import('../../types/fontkit').OTLookup} OTLookup */\n/** @typedef {import('../../types/fontkit').FeatureLookup} FeatureLookup */\n/** @typedef {import('../../types/fontkit').CoverageTable} CoverageTable */\n/** @typedef {import('../../types/fontkit').ClassDefTable} ClassDefTable */\n/** @typedef {import('../../types/fontkit').ContextSubtable} ContextSubtable */\n/** @typedef {import('../../types/fontkit').ChainContextSubtable} ChainContextSubtable */\n/** @typedef {import('../../types/fontkit').LookupRecord} LookupRecord */\n/** @typedef {import('../../types/fontkit').FeatureVariationCondition} FeatureVariationCondition */\n/** @typedef {import('../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n/** @typedef {import('../../types/fontkit').GlyphPositionLike} GlyphPositionLike */\n/** @typedef {import('../../types/fontkit').ScriptTag} ScriptTag */\n/** @typedef {import('../../types/fontkit').LanguageTag} LanguageTag */\n/** @typedef {import('../../types/fontkit').TextDirection} TextDirection */\n/** @typedef {import('../../types/fontkit').FeatureMap} FeatureMap */\n/** @typedef {import('../../types/fontkit').MarkFilteringSet} MarkFilteringSet */\n/** @typedef {import('restructure').StructValue} StructValue */\n\nconst DEFAULT_SCRIPTS = ['DFLT', 'dflt', 'latn'];\n\nexport default class OTProcessor {\n /**\n * @param {LayoutFont} font\n * @param {OTLayoutTable} table\n */\n constructor(font, table) {\n /** @type {LayoutFont} */\n this.font = font;\n /** @type {OTLayoutTable} */\n this.table = table;\n\n /** @type {OTScript | null} */\n this.script = null;\n /** @type {string | null} */\n this.scriptTag = null;\n\n /** @type {OTLangSys | null} */\n this.language = null;\n /** @type {string | null} */\n this.languageTag = null;\n\n /** @type {TextDirection | undefined} */\n this.direction = undefined;\n\n /** @type {Record<string, OTFeature>} */\n this.features = {};\n /** @type {Record<string, unknown>} */\n this.lookups = {};\n\n /** @type {FeatureMap | null} */\n this.userFeatures = null;\n\n // FeatureVariations apply at the current location; default to normalized\n // origin when no variation is set (HarfBuzz behavior). Without this,\n // variable fonts skip FeatureVariations until getVariation() is called.\n let coords = font._variationProcessor?.normalizedCoords\n ?? (font.fvar ? new Array(font.fvar.axis.length).fill(0) : null);\n /** @type {number} */\n this.variationsIndex = coords ? this.findVariationsIndex(coords) : -1;\n\n // initialize to default script + language\n this.selectScript();\n\n // current context (set by applyFeatures)\n /** @type {GlyphInfoLike[]} */\n this.glyphs = [];\n /** @type {GlyphPositionLike[] | null | undefined} */\n this.positions = []; // only used by GPOS\n /** @type {number} */\n this.ligatureID = 1;\n /** @type {string | null} */\n this.currentFeature = null;\n /** @type {GlyphIterator | undefined} */\n this.glyphIterator = undefined;\n /** @type {Map<CoverageTable, MarkFilteringSet> | undefined} */\n this._markFilteringCache = undefined;\n }\n\n /**\n * @param {ScriptTag | string[] | null | undefined} script\n * @returns {OTScriptRecord | null}\n */\n findScript(script) {\n if (this.table.scriptList == null) {\n return null;\n }\n\n /** @type {string[]} */\n let scripts;\n if (!Array.isArray(script)) {\n scripts = script == null ? [] : [script];\n } else {\n scripts = script;\n }\n\n for (let s of scripts) {\n for (let entry of this.table.scriptList) {\n if (entry.tag === s) {\n return entry;\n }\n }\n }\n\n return null;\n }\n\n /**\n * @param {ScriptTag | string[] | null | undefined} [script]\n * @param {LanguageTag | null | undefined} [language]\n * @param {TextDirection | null | undefined} [direction]\n * @returns {string | null}\n */\n selectScript(script, language, direction) {\n let changed = false;\n /** @type {OTScriptRecord | null | undefined} */\n let entry;\n if (!this.script || script !== this.scriptTag) {\n entry = this.findScript(script);\n if (!entry) {\n entry = this.findScript(DEFAULT_SCRIPTS);\n }\n\n if (!entry) {\n return this.scriptTag;\n }\n\n this.scriptTag = entry.tag;\n this.script = entry.script;\n this.language = null;\n this.languageTag = null;\n changed = true;\n }\n\n if (!direction || direction !== this.direction) {\n this.direction = direction || Script.direction(script);\n }\n\n if (language && language.length < 4) {\n language += ' '.repeat(4 - language.length);\n }\n\n if (!language || language !== this.languageTag) {\n this.language = null;\n\n if (this.script) {\n for (let lang of this.script.langSysRecords) {\n if (lang.tag === language) {\n this.language = lang.langSys;\n this.languageTag = lang.tag;\n break;\n }\n }\n\n if (!this.language) {\n this.language = this.script.defaultLangSys;\n this.languageTag = null;\n }\n }\n\n changed = true;\n }\n\n // Build a feature lookup table\n if (changed) {\n this.features = {};\n if (this.language) {\n for (let featureIndex of this.language.featureIndexes) {\n let record = this.table.featureList[featureIndex];\n let substituteFeature = this.substituteFeatureForVariations(featureIndex);\n this.features[record.tag] = substituteFeature || record.feature;\n }\n }\n }\n\n return this.scriptTag;\n }\n\n /**\n * @param {string[]} [userFeatures]\n * @param {number[] | null | undefined} [exclude]\n * @returns {FeatureLookup[]}\n */\n lookupsForFeatures(userFeatures = [], exclude) {\n /** @type {FeatureLookup[]} */\n let lookups = [];\n for (let tag of userFeatures) {\n let feature = this.features[tag];\n if (!feature) {\n continue;\n }\n\n for (let lookupIndex of feature.lookupListIndexes) {\n if (exclude && exclude.indexOf(lookupIndex) !== -1) {\n continue;\n }\n\n lookups.push({\n feature: tag,\n index: lookupIndex,\n lookup: this.table.lookupList.get(lookupIndex)\n });\n }\n }\n\n lookups.sort((a, b) => a.index - b.index);\n return lookups;\n }\n\n /**\n * @param {number} featureIndex\n * @returns {OTFeature | null}\n */\n substituteFeatureForVariations(featureIndex) {\n if (this.variationsIndex === -1) {\n return null;\n }\n\n let variations = this.table.featureVariations;\n if (!variations) {\n return null;\n }\n\n let record = variations.featureVariationRecords[this.variationsIndex];\n let substitutions = record.featureTableSubstitution.substitutions;\n for (let substitution of substitutions) {\n if (substitution.featureIndex === featureIndex) {\n return substitution.alternateFeatureTable;\n }\n }\n\n return null;\n }\n\n /**\n * @param {number[]} coords\n * @returns {number}\n */\n findVariationsIndex(coords) {\n let variations = this.table.featureVariations;\n if (!variations) {\n return -1;\n }\n\n let records = variations.featureVariationRecords;\n for (let i = 0; i < records.length; i++) {\n let conditions = records[i].conditionSet.conditionTable;\n if (this.variationConditionsMatch(conditions, coords)) {\n return i;\n }\n }\n\n return -1;\n }\n\n /**\n * @param {FeatureVariationCondition[]} conditions\n * @param {number[]} coords\n * @returns {boolean}\n */\n variationConditionsMatch(conditions, coords) {\n return conditions.every(/** @param {FeatureVariationCondition} condition */ (condition) => {\n let coord = condition.axisIndex < coords.length ? coords[condition.axisIndex] : 0;\n return condition.filterRangeMinValue <= coord && coord <= condition.filterRangeMaxValue;\n });\n }\n\n /**\n * @param {string[]} userFeatures\n * @param {GlyphInfoLike[]} glyphs\n * @param {GlyphPositionLike[] | null | undefined} [advances]\n */\n applyFeatures(userFeatures, glyphs, advances) {\n let lookups = this.lookupsForFeatures(userFeatures);\n this.applyLookups(lookups, glyphs, advances);\n }\n\n /**\n * @param {FeatureLookup[]} lookups\n * @param {GlyphInfoLike[]} glyphs\n * @param {GlyphPositionLike[] | null | undefined} [positions]\n */\n applyLookups(lookups, glyphs, positions) {\n this.glyphs = glyphs;\n this.positions = positions;\n this.glyphIterator = new GlyphIterator(glyphs);\n\n for (let { feature, lookup } of lookups) {\n this.currentFeature = feature;\n\n // Direction may be RTL for some lookups (see lookupDirection).\n let direction = this.lookupDirection(lookup);\n this.glyphIterator.reset(\n lookup.flags,\n direction < 0 ? glyphs.length - 1 : 0,\n this.getMarkFilteringSet(lookup)\n );\n\n while (this.glyphIterator.index >= 0 && this.glyphIterator.index < glyphs.length) {\n let cur = this.glyphIterator.cur;\n if (cur && feature in cur.features) {\n for (let table of lookup.subTables) {\n if (this.applyLookup(lookup.lookupType, table)) {\n break;\n }\n }\n }\n this.glyphIterator.move(direction);\n }\n }\n }\n\n /**\n * Subclasses may reverse iteration for specific lookup types (e.g. GSUB Type 8).\n * @param {OTLookup} _lookup\n * @returns {number}\n */\n lookupDirection(_lookup) {\n return 1;\n }\n\n /**\n * @param {number} _lookup\n * @param {StructValue} _table\n * @returns {boolean}\n */\n applyLookup(_lookup, _table) {\n throw new Error('applyLookup must be implemented by subclasses');\n }\n\n /**\n * @param {LookupRecord[]} lookupRecords\n * @returns {boolean}\n */\n applyLookupList(lookupRecords) {\n let glyphIterator = this.glyphIterator;\n if (!glyphIterator) {\n return false;\n }\n\n let options = glyphIterator.options;\n let markFilteringSet = glyphIterator.markFilteringSet;\n let glyphIndex = glyphIterator.index;\n\n for (let lookupRecord of lookupRecords) {\n // Reset flags and find glyph index for this lookup record\n glyphIterator.reset(options, glyphIndex, markFilteringSet);\n glyphIterator.increment(lookupRecord.sequenceIndex);\n\n // Get the lookup and setup flags for subtables\n let lookup = this.table.lookupList.get(lookupRecord.lookupListIndex);\n glyphIterator.reset(lookup.flags, glyphIterator.index, this.getMarkFilteringSet(lookup));\n\n // Apply lookup subtables until one matches\n for (let table of lookup.subTables) {\n if (this.applyLookup(lookup.lookupType, table)) {\n break;\n }\n }\n }\n\n glyphIterator.reset(options, glyphIndex, markFilteringSet);\n return true;\n }\n\n /**\n * @param {OTLookup} lookup\n * @returns {MarkFilteringSet | null}\n */\n getMarkFilteringSet(lookup) {\n if (!lookup.flags.flags?.useMarkFilteringSet) {\n return null;\n }\n\n let coverage = this.font.GDEF?.markGlyphSetsDef?.coverage?.[lookup.markFilteringSet ?? -1];\n if (!coverage) {\n return null;\n }\n\n // Cache a Set-like {has} that reuses coverageIndex (avoids expanding large ranges).\n let cache = (this._markFilteringCache ??= new Map());\n let filter = cache.get(coverage);\n if (!filter) {\n filter = { has: /** @param {number} id */ id => this.coverageIndex(coverage, id) >= 0 };\n cache.set(coverage, filter);\n }\n return filter;\n }\n\n /**\n * @param {CoverageTable} coverage\n * @param {number | null | undefined} [glyph]\n * @returns {number}\n */\n coverageIndex(coverage, glyph) {\n if (glyph == null) {\n let cur = this.glyphIterator?.cur;\n if (!cur) {\n return -1;\n }\n glyph = cur.id;\n }\n\n switch (coverage.version) {\n case 1:\n return coverage.glyphs ? coverage.glyphs.indexOf(glyph) : -1;\n\n case 2:\n if (coverage.rangeRecords) {\n for (let range of coverage.rangeRecords) {\n if (range.start <= glyph && glyph <= range.end) {\n return range.startCoverageIndex + glyph - range.start;\n }\n }\n }\n\n break;\n }\n\n return -1;\n }\n\n /**\n * @template T\n * @param {number} sequenceIndex\n * @param {T[]} sequence\n * @param {(component: T, glyph: GlyphInfoLike) => boolean} fn\n * @param {number[] | null | undefined} [matched]\n * @returns {boolean | number[]}\n */\n match(sequenceIndex, sequence, fn, matched) {\n let glyphIterator = this.glyphIterator;\n if (!glyphIterator) {\n return false;\n }\n\n let pos = glyphIterator.index;\n /** @type {GlyphInfoLike | null | undefined} */\n let glyph = glyphIterator.increment(sequenceIndex);\n let idx = 0;\n\n while (idx < sequence.length && glyph && fn(sequence[idx], glyph)) {\n if (matched) {\n matched.push(glyphIterator.index);\n }\n\n idx++;\n glyph = glyphIterator.next();\n }\n\n glyphIterator.index = pos;\n if (idx < sequence.length) {\n return false;\n }\n\n return matched || true;\n }\n\n /**\n * @param {number} sequenceIndex\n * @param {number[]} sequence\n * @returns {boolean | number[]}\n */\n sequenceMatches(sequenceIndex, sequence) {\n return this.match(sequenceIndex, sequence, /** @param {number} component @param {GlyphInfoLike} glyph */ (component, glyph) => component === glyph.id);\n }\n\n /**\n * @param {number} sequenceIndex\n * @param {number[]} sequence\n * @returns {false | number[]}\n */\n sequenceMatchIndices(sequenceIndex, sequence) {\n let result = this.match(sequenceIndex, sequence, /** @param {number} component @param {GlyphInfoLike} glyph */ (component, glyph) => {\n // If the current feature doesn't apply to this glyph,\n if (!(this.currentFeature && this.currentFeature in glyph.features)) {\n return false;\n }\n\n return component === glyph.id;\n }, []);\n return result === false ? false : /** @type {number[]} */ (result);\n }\n\n /**\n * @param {number} sequenceIndex\n * @param {CoverageTable[]} sequence\n * @returns {boolean | number[]}\n */\n coverageSequenceMatches(sequenceIndex, sequence) {\n return this.match(sequenceIndex, sequence, /** @param {CoverageTable} coverage @param {GlyphInfoLike} glyph */ (coverage, glyph) =>\n this.coverageIndex(coverage, glyph.id) >= 0\n );\n }\n\n /**\n * @param {number} glyph\n * @param {ClassDefTable | null | undefined} classDef\n * @returns {number}\n */\n getClassID(glyph, classDef) {\n // Offset 0 ClassDefs decode as null; treat as class 0 (OT default).\n if (!classDef) {\n return 0;\n }\n\n switch (classDef.version) {\n case 1: { // Class array\n let i = glyph - (classDef.startGlyph ?? 0);\n if (classDef.classValueArray && i >= 0 && i < classDef.classValueArray.length) {\n return classDef.classValueArray[i];\n }\n\n break;\n }\n\n case 2:\n if (classDef.classRangeRecord) {\n for (let range of classDef.classRangeRecord) {\n if (range.start <= glyph && glyph <= range.end) {\n return range.class;\n }\n }\n }\n\n break;\n }\n\n return 0;\n }\n\n /**\n * @param {number} sequenceIndex\n * @param {number[]} sequence\n * @param {ClassDefTable | null | undefined} classDef\n * @returns {boolean | number[]}\n */\n classSequenceMatches(sequenceIndex, sequence, classDef) {\n return this.match(sequenceIndex, sequence, /** @param {number} classID @param {GlyphInfoLike} glyph */ (classID, glyph) =>\n classID === this.getClassID(glyph.id, classDef)\n );\n }\n\n /**\n * @param {ContextSubtable | StructValue} table\n * @returns {boolean}\n */\n applyContext(table) {\n let ctx = /** @type {ContextSubtable} */ (table);\n let index;\n /** @type {import('../../types/fontkit').ContextRule[] | null | undefined} */\n let set;\n switch (ctx.version) {\n case 1:\n index = this.coverageIndex(ctx.coverage);\n if (index === -1) {\n return false;\n }\n\n set = ctx.ruleSets?.[index];\n if (!set) {\n return false;\n }\n for (let rule of set) {\n if (this.sequenceMatches(1, rule.input)) {\n return this.applyLookupList(rule.lookupRecords);\n }\n }\n\n break;\n\n case 2: {\n if (this.coverageIndex(ctx.coverage) === -1) {\n return false;\n }\n\n let cur = this.glyphIterator?.cur;\n if (!cur || !ctx.classDef) {\n return false;\n }\n\n index = this.getClassID(cur.id, ctx.classDef);\n set = ctx.classSet?.[index];\n if (!set) {\n return false;\n }\n for (let rule of set) {\n if (this.classSequenceMatches(1, rule.classes ?? [], ctx.classDef)) {\n return this.applyLookupList(rule.lookupRecords);\n }\n }\n\n break;\n }\n\n case 3:\n if (ctx.coverages && ctx.lookupRecords && this.coverageSequenceMatches(0, ctx.coverages)) {\n return this.applyLookupList(ctx.lookupRecords);\n }\n\n break;\n }\n\n return false;\n }\n\n /**\n * @param {ChainContextSubtable | StructValue} table\n * @returns {boolean}\n */\n applyChainingContext(table) {\n let ctx = /** @type {ChainContextSubtable} */ (table);\n let index;\n switch (ctx.version) {\n case 1: {\n index = this.coverageIndex(ctx.coverage);\n if (index === -1) {\n return false;\n }\n\n let set = ctx.chainRuleSets?.[index];\n if (!set) {\n return false;\n }\n for (let rule of set) {\n // Backtrack is stored closest-first; sequenceMatches walks furthest-first.\n if (this.sequenceMatches(-rule.backtrack.length, [...rule.backtrack].reverse())\n && this.sequenceMatches(1, rule.input)\n && this.sequenceMatches(1 + rule.input.length, rule.lookahead)) {\n return this.applyLookupList(rule.lookupRecords);\n }\n }\n\n break;\n }\n\n case 2: {\n if (this.coverageIndex(ctx.coverage) === -1) {\n return false;\n }\n\n let cur = this.glyphIterator?.cur;\n if (!cur || !ctx.inputClassDef) {\n return false;\n }\n\n index = this.getClassID(cur.id, ctx.inputClassDef);\n let rules = ctx.chainClassSet?.[index];\n if (!rules) {\n return false;\n }\n\n for (let rule of rules) {\n // Backtrack/lookahead ClassDefs may be NULL (offset 0) when unused.\n if (this.classSequenceMatches(-rule.backtrack.length, [...rule.backtrack].reverse(), ctx.backtrackClassDef)\n && this.classSequenceMatches(1, rule.input, ctx.inputClassDef)\n && this.classSequenceMatches(1 + rule.input.length, rule.lookahead, ctx.lookaheadClassDef)) {\n return this.applyLookupList(rule.lookupRecords);\n }\n }\n\n break;\n }\n\n case 3:\n if (ctx.backtrackCoverage && ctx.inputCoverage && ctx.lookaheadCoverage && ctx.lookupRecords\n && this.coverageSequenceMatches(-(ctx.backtrackGlyphCount ?? ctx.backtrackCoverage.length), [...ctx.backtrackCoverage].reverse())\n && this.coverageSequenceMatches(0, ctx.inputCoverage)\n && this.coverageSequenceMatches(ctx.inputGlyphCount ?? ctx.inputCoverage.length, ctx.lookaheadCoverage)) {\n return this.applyLookupList(ctx.lookupRecords);\n }\n\n break;\n }\n\n return false;\n }\n}\n", "import { isMark } from '../packages/unicode-properties/index.js';\nimport OTProcessor from './OTProcessor';\n\n/** @typedef {import('../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../types/fontkit').FeatureMap} FeatureMap */\n/** @typedef {import('../../types/fontkit').FeatureInput} FeatureInput */\n/** @typedef {import('../../types/fontkit').ClassDefTable} ClassDefTable */\n\nexport default class GlyphInfo {\n /**\n * @param {LayoutFont} font\n * @param {number} id\n * @param {number[]} [codePoints]\n * @param {FeatureInput | null | undefined} [features]\n */\n constructor(font, id, codePoints = [], features) {\n /** @type {LayoutFont} */\n this._font = font;\n /** @type {number[]} */\n this.codePoints = codePoints;\n /** @type {number} */\n this._id = 0;\n\n /** @type {FeatureMap} */\n this.features = {};\n if (Array.isArray(features)) {\n for (let i = 0; i < features.length; i++) {\n let feature = features[i];\n this.features[feature] = true;\n }\n } else if (typeof features === 'object' && features !== null) {\n Object.assign(this.features, features);\n }\n\n /** @type {number | null} */\n this.ligatureID = null;\n /** @type {number | null} */\n this.ligatureComponent = null;\n /** @type {boolean} */\n this.isLigated = false;\n /** @type {number | null} */\n this.cursiveAttachment = null;\n /** @type {number | null} */\n this.markAttachment = null;\n /** @type {import('../../types/fontkit').IndicShaperInfo | import('../../types/fontkit').USEShaperInfo | null} */\n this.shaperInfo = null;\n /** @type {boolean} */\n this.substituted = false;\n /** @type {boolean} */\n this.isMultiplied = false;\n\n /** @type {boolean} */\n this.isBase = false;\n /** @type {boolean} */\n this.isLigature = false;\n /** @type {boolean} */\n this.isMark = false;\n /** @type {number} */\n this.markAttachmentType = 0;\n\n // Apply GDEF / mark classification via the id setter, then clear\n // `substituted` \u2014 construction is not a GSUB substitution.\n this.id = id;\n this.substituted = false;\n }\n\n /**\n * @returns {number}\n */\n get id() {\n return this._id;\n }\n\n /**\n * @param {number} id\n */\n set id(id) {\n this._id = id;\n this.substituted = true;\n\n let GDEF = this._font.GDEF;\n if (GDEF && GDEF.glyphClassDef) {\n // TODO: clean this up\n let classID = OTProcessor.prototype.getClassID(id, /** @type {ClassDefTable} */ (GDEF.glyphClassDef));\n this.isBase = classID === 1;\n this.isLigature = classID === 2;\n this.isMark = classID === 3;\n this.markAttachmentType = GDEF.markAttachClassDef\n ? OTProcessor.prototype.getClassID(id, /** @type {ClassDefTable} */ (GDEF.markAttachClassDef))\n : 0;\n } else {\n this.isMark = this.codePoints.length > 0 && this.codePoints.every(isMark);\n this.isBase = !this.isMark;\n this.isLigature = this.codePoints.length > 1;\n this.markAttachmentType = 0;\n }\n }\n\n /**\n * @returns {GlyphInfo}\n */\n copy() {\n return new GlyphInfo(this._font, this.id, this.codePoints, this.features);\n }\n}\n", "import { isDigit, isMark } from '../../packages/unicode-properties/index.js';\nimport GlyphInfo from '../GlyphInfo';\n\n/** @typedef {import('../../../types/fontkit').ShapingPlanLike} ShapingPlanLike */\n/** @typedef {import('../../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n/** @typedef {import('../../../types/fontkit').FeatureInput} FeatureInput */\n/** @typedef {import('../../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../../types/fontkit').FeatureMap} FeatureMap */\n/** @typedef {import('../../../types/fontkit').TextDirection} TextDirection */\n\nconst VARIATION_FEATURES = ['rvrn'];\nconst COMMON_FEATURES = ['ccmp', 'locl', 'rlig', 'mark', 'mkmk'];\nconst FRACTIONAL_FEATURES = ['frac', 'numr', 'dnom'];\nconst HORIZONTAL_FEATURES = ['calt', 'clig', 'liga', 'rclt', 'curs', 'kern'];\nconst _VERTICAL_FEATURES = ['vert'];\n/** @type {Record<TextDirection, string[]>} */\nconst DIRECTIONAL_FEATURES = {\n ltr: ['ltra', 'ltrm'],\n rtl: ['rtla', 'rtlm']\n};\n\nexport default class DefaultShaper {\n static zeroMarkWidths = 'AFTER_GPOS';\n\n /**\n * @param {ShapingPlanLike} plan\n * @param {GlyphInfoLike[]} glyphs\n * @param {FeatureInput | null | undefined} features\n */\n static plan(plan, glyphs, features) {\n // Plan the features we want to apply\n this.planPreprocessing(plan);\n this.planFeatures(plan);\n this.planPostprocessing(plan, features);\n\n // Assign the global features to all the glyphs\n plan.assignGlobalFeatures(glyphs);\n\n // Assign local features to glyphs\n this.assignFeatures(plan, glyphs);\n }\n\n /**\n * @param {ShapingPlanLike} plan\n */\n static planPreprocessing(plan) {\n plan.add({\n global: [...VARIATION_FEATURES, ...DIRECTIONAL_FEATURES[plan.direction]],\n local: FRACTIONAL_FEATURES\n });\n }\n\n /**\n * @param {ShapingPlanLike} _plan\n */\n static planFeatures(_plan) {\n // Do nothing by default. Let subclasses override this.\n }\n\n /**\n * @param {ShapingPlanLike} plan\n * @param {FeatureInput | null | undefined} userFeatures\n */\n static planPostprocessing(plan, userFeatures) {\n plan.add([...COMMON_FEATURES, ...HORIZONTAL_FEATURES]);\n plan.setFeatureOverrides(userFeatures);\n }\n\n /**\n * @param {ShapingPlanLike} plan\n * @param {GlyphInfoLike[]} glyphs\n */\n static assignFeatures(plan, glyphs) {\n // Font-aware NFC before GSUB (HarfBuzz default-shaper behavior).\n composeGlyphs(plan.font, glyphs);\n\n // Enable contextual fractions\n for (let i = 0; i < glyphs.length; i++) {\n let glyph = glyphs[i];\n if (glyph.codePoints[0] === 0x2044) { // fraction slash\n let start = i;\n let end = i + 1;\n\n // Apply numerator\n while (start > 0 && isDigit(glyphs[start - 1].codePoints[0])) {\n glyphs[start - 1].features.numr = true;\n glyphs[start - 1].features.frac = true;\n start--;\n }\n\n // Apply denominator\n while (end < glyphs.length && isDigit(glyphs[end].codePoints[0])) {\n glyphs[end].features.dnom = true;\n glyphs[end].features.frac = true;\n end++;\n }\n\n // Apply fraction slash\n glyph.features.frac = true;\n i = end - 1;\n }\n }\n }\n}\n\n/**\n * Compose base+mark clusters when the font has the precomposed glyph.\n * Skip pure mark reorders (same length) so Arabic calt etc. keep expected order.\n * @param {LayoutFont} font\n * @param {GlyphInfoLike[]} glyphs\n */\nfunction composeGlyphs(font, glyphs) {\n /**\n * @param {GlyphInfoLike} g\n * @returns {boolean}\n */\n let singleMark = g => g.codePoints.length === 1 && isMark(g.codePoints[0]);\n\n for (let i = 0; i < glyphs.length;) {\n let base = glyphs[i];\n if (base.codePoints.length !== 1 || isMark(base.codePoints[0])) {\n i++;\n continue;\n }\n\n let end = i + 1;\n while (end < glyphs.length && singleMark(glyphs[end])) end++;\n if (end === i + 1) {\n i++;\n continue;\n }\n\n let input = glyphs.slice(i, end).map(/** @param {GlyphInfoLike} g */ g => g.codePoints[0]);\n let composed = Array.from(String.fromCodePoint(...input).normalize('NFC')).flatMap((char) => {\n let cp = char.codePointAt(0);\n if (cp == null) {\n return /** @type {number[]} */ ([]);\n }\n return font.hasGlyphForCodePoint(cp)\n ? [cp]\n : Array.from(char.normalize('NFD'), c => /** @type {number} */ (c.codePointAt(0)));\n });\n\n if (composed.length === input.length) {\n i = end;\n continue;\n }\n\n /** @type {GlyphInfo[]} */\n let replacement = [];\n for (let cp of composed) {\n let g = font.glyphForCodePoint(cp);\n if (g) {\n replacement.push(new GlyphInfo(font, g.id, [cp], /** @type {FeatureMap} */ (base.features)));\n }\n }\n glyphs.splice(i, end - i, ...replacement);\n i += replacement.length;\n }\n}\n", "import DefaultShaper from './DefaultShaper';\nimport { getCategory } from '../../packages/unicode-properties/index.js';\nimport UnicodeTrie from '../../packages/unicode-trie/index.js';\nimport { decodeBase64 } from '../../utils';\nimport dataTrie from './data.trie';\n\n/** @typedef {import('../../../types/fontkit').ShapingPlanLike} ShapingPlanLike */\n/** @typedef {import('../../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n\nconst trie = new UnicodeTrie(decodeBase64(dataTrie));\nconst FEATURES = ['isol', 'fina', 'fin2', 'fin3', 'medi', 'med2', 'init'];\n\nconst ShapingClasses = {\n Non_Joining: 0,\n Left_Joining: 1,\n Right_Joining: 2,\n Dual_Joining: 3,\n Join_Causing: 3,\n ALAPH: 4,\n 'DALATH RISH': 5,\n Transparent: 6\n};\n\nconst ISOL = 'isol';\nconst FINA = 'fina';\nconst FIN2 = 'fin2';\nconst FIN3 = 'fin3';\nconst MEDI = 'medi';\nconst MED2 = 'med2';\nconst INIT = 'init';\n/** @type {null} */\nconst NONE = null;\n\n/** @typedef {[string | null, string | null, number]} ArabicStateTransition */\n\n// Each entry is [prevAction, curAction, nextState]\n/** @type {ArabicStateTransition[][]} */\nconst STATE_TABLE = [\n // Non_Joining, Left_Joining, Right_Joining, Dual_Joining, ALAPH, DALATH RISH\n // State 0: prev was U, not willing to join.\n [[NONE, NONE, 0], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 6]],\n\n // State 1: prev was R or ISOL/ALAPH, not willing to join.\n [[NONE, NONE, 0], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 2], [NONE, FIN2, 5], [NONE, ISOL, 6]],\n\n // State 2: prev was D/L in ISOL form, willing to join.\n [[NONE, NONE, 0], [NONE, ISOL, 2], [INIT, FINA, 1], [INIT, FINA, 3], [INIT, FINA, 4], [INIT, FINA, 6]],\n\n // State 3: prev was D in FINA form, willing to join.\n [[NONE, NONE, 0], [NONE, ISOL, 2], [MEDI, FINA, 1], [MEDI, FINA, 3], [MEDI, FINA, 4], [MEDI, FINA, 6]],\n\n // State 4: prev was FINA ALAPH, not willing to join.\n [[NONE, NONE, 0], [NONE, ISOL, 2], [MED2, ISOL, 1], [MED2, ISOL, 2], [MED2, FIN2, 5], [MED2, ISOL, 6]],\n\n // State 5: prev was FIN2/FIN3 ALAPH, not willing to join.\n [[NONE, NONE, 0], [NONE, ISOL, 2], [ISOL, ISOL, 1], [ISOL, ISOL, 2], [ISOL, FIN2, 5], [ISOL, ISOL, 6]],\n\n // State 6: prev was DALATH/RISH, not willing to join.\n [[NONE, NONE, 0], [NONE, ISOL, 2], [NONE, ISOL, 1], [NONE, ISOL, 2], [NONE, FIN3, 5], [NONE, ISOL, 6]]\n];\n\n/**\n * This is a shaper for Arabic, and other cursive scripts.\n * It uses data from ArabicShaping.txt in the Unicode database,\n * compiled to a UnicodeTrie by generate-data.coffee.\n *\n * The shaping state machine was ported from Harfbuzz.\n * https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-complex-arabic.cc\n */\nexport default class ArabicShaper extends DefaultShaper {\n /**\n * @param {ShapingPlanLike} plan\n */\n static planFeatures(plan) {\n plan.add(['ccmp', 'locl']);\n for (let i = 0; i < FEATURES.length; i++) {\n let feature = FEATURES[i];\n plan.addStage(feature, false);\n }\n\n plan.addStage('mset');\n }\n\n /**\n * @param {ShapingPlanLike} plan\n * @param {GlyphInfoLike[]} glyphs\n */\n static assignFeatures(plan, glyphs) {\n super.assignFeatures(plan, glyphs);\n\n let prev = -1;\n let state = 0;\n /** @type {Array<string | null | undefined>} */\n let actions = [];\n\n // Apply the state machine to map glyphs to features\n for (let i = 0; i < glyphs.length; i++) {\n let curAction, prevAction;\n let glyph = glyphs[i];\n let type = getShapingClass(glyph.codePoints[0]);\n if (type === ShapingClasses.Transparent) {\n actions[i] = NONE;\n continue;\n }\n\n [prevAction, curAction, state] = STATE_TABLE[state][type];\n\n if (prevAction !== NONE && prev !== -1) {\n actions[prev] = prevAction;\n }\n\n actions[i] = curAction;\n prev = i;\n }\n\n // Apply the chosen features to their respective glyphs\n for (let index = 0; index < glyphs.length; index++) {\n let feature;\n let glyph = glyphs[index];\n if ((feature = actions[index])) {\n glyph.features[feature] = true;\n }\n }\n }\n}\n\n/**\n * @param {number} codePoint\n * @returns {number}\n */\nfunction getShapingClass(codePoint) {\n let res = trie.get(codePoint);\n if (res) {\n return res - 1;\n }\n\n let category = getCategory(codePoint);\n if (category === 'Mn' || category === 'Me' || category === 'Cf') {\n return ShapingClasses.Transparent;\n }\n\n return ShapingClasses.Non_Joining;\n}\n", "import DefaultShaper from './DefaultShaper';\nimport GlyphInfo from '../GlyphInfo';\n\n/** @typedef {import('../../../types/fontkit').ShapingPlanLike} ShapingPlanLike */\n/** @typedef {import('../../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n/** @typedef {import('../../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../../types/fontkit').FeatureMap} FeatureMap */\n/** @typedef {import('../../../types/fontkit').FeatureInput} FeatureInput */\n\n/**\n * This is a shaper for the Hangul script, used by the Korean language.\n * It does the following:\n * - decompose if unsupported by the font:\n * <LV> -> <L,V>\n * <LVT> -> <L,V,T>\n * <LV,T> -> <L,V,T>\n *\n * - compose if supported by the font:\n * <L,V> -> <LV>\n * <L,V,T> -> <LVT>\n * <LV,T> -> <LVT>\n *\n * - reorder tone marks (S is any valid syllable):\n * <S, M> -> <M, S>\n *\n * - apply ljmo, vjmo, and tjmo OpenType features to decomposed Jamo sequences.\n *\n * This logic is based on the following documents:\n * - http://www.microsoft.com/typography/OpenTypeDev/hangul/intro.htm\n * - http://ktug.org/~nomos/harfbuzz-hangul/hangulshaper.pdf\n */\nexport default class HangulShaper extends DefaultShaper {\n static zeroMarkWidths = 'NONE';\n\n /**\n * @param {ShapingPlanLike} plan\n */\n static planFeatures(plan) {\n plan.add(['ljmo', 'vjmo', 'tjmo'], false);\n }\n\n /**\n * @param {ShapingPlanLike} plan\n * @param {GlyphInfoLike[]} glyphs\n */\n static assignFeatures(plan, glyphs) {\n let state = 0;\n let i = 0;\n while (i < glyphs.length) {\n let action;\n let glyph = glyphs[i];\n let code = glyph.codePoints[0];\n let type = getType(code);\n\n [action, state] = STATE_TABLE[state][type];\n\n switch (action) {\n case DECOMPOSE:\n // Decompose the composed syllable if it is not supported by the font.\n if (!plan.font.hasGlyphForCodePoint(code)) {\n i = decompose(glyphs, i, plan.font);\n }\n break;\n\n case COMPOSE:\n // Found a decomposed syllable. Try to compose if supported by the font.\n i = compose(glyphs, i, plan.font);\n break;\n\n case TONE_MARK:\n // Got a valid syllable, followed by a tone mark. Move the tone mark to the beginning of the syllable.\n reorderToneMark(glyphs, i, plan.font);\n break;\n\n case INVALID:\n // Tone mark has no valid syllable to attach to, so insert a dotted circle\n i = insertDottedCircle(glyphs, i, plan.font);\n break;\n }\n\n i++;\n }\n }\n}\n\nconst HANGUL_BASE = 0xac00;\nconst HANGUL_END = 0xd7a4;\nconst HANGUL_COUNT = HANGUL_END - HANGUL_BASE + 1;\nconst L_BASE = 0x1100; // lead\nconst V_BASE = 0x1161; // vowel\nconst T_BASE = 0x11a7; // trail\nconst L_COUNT = 19;\nconst V_COUNT = 21;\nconst T_COUNT = 28;\nconst L_END = L_BASE + L_COUNT - 1;\nconst V_END = V_BASE + V_COUNT - 1;\nconst T_END = T_BASE + T_COUNT - 1;\nconst DOTTED_CIRCLE = 0x25cc;\n\n/** @param {number} code @returns {boolean} */\nconst isL = code => 0x1100 <= code && code <= 0x115f || 0xa960 <= code && code <= 0xa97c;\n/** @param {number} code @returns {boolean} */\nconst isV = code => 0x1160 <= code && code <= 0x11a7 || 0xd7b0 <= code && code <= 0xd7c6;\n/** @param {number} code @returns {boolean} */\nconst isT = code => 0x11a8 <= code && code <= 0x11ff || 0xd7cb <= code && code <= 0xd7fb;\n/** @param {number} code @returns {boolean} */\nconst isTone = code => 0x302e <= code && code <= 0x302f;\n/** @param {number} code @returns {boolean} */\nconst isLVT = code => HANGUL_BASE <= code && code <= HANGUL_END;\n/** @param {number} code @returns {boolean} */\nconst isLV = code => (code - HANGUL_BASE) < HANGUL_COUNT && (code - HANGUL_BASE) % T_COUNT === 0;\n/** @param {number} code @returns {boolean} */\nconst isCombiningL = code => L_BASE <= code && code <= L_END;\n/** @param {number} code @returns {boolean} */\nconst isCombiningV = code => V_BASE <= code && code <= V_END;\n/** @param {number} code @returns {boolean} */\nconst isCombiningT = code => T_BASE + 1 <= code && code <= T_END;\n\n// Character categories\nconst X = 0; // Other character\nconst L = 1; // Leading consonant\nconst V = 2; // Medial vowel\nconst T = 3; // Trailing consonant\nconst LV = 4; // Composed <LV> syllable\nconst LVT = 5; // Composed <LVT> syllable\nconst M = 6; // Tone mark\n\n/**\n * This function classifies a character using the above categories.\n * @param {number} code\n * @returns {number}\n */\nfunction getType(code) {\n if (isL(code)) { return L; }\n if (isV(code)) { return V; }\n if (isT(code)) { return T; }\n if (isLV(code)) { return LV; }\n if (isLVT(code)) { return LVT; }\n if (isTone(code)) { return M; }\n return X;\n}\n\n// State machine actions\nconst NO_ACTION = 0;\nconst DECOMPOSE = 1;\nconst COMPOSE = 2;\nconst TONE_MARK = 4;\nconst INVALID = 5;\n\n/** @typedef {[number, number]} HangulTransition */\n\n// Build a state machine that accepts valid syllables, and applies actions along the way.\n// The logic this is implementing is documented at the top of the file.\n/** @type {HangulTransition[][]} */\nconst STATE_TABLE = [\n // X L V T LV LVT M\n // State 0: start state\n [[NO_ACTION, 0], [NO_ACTION, 1], [NO_ACTION, 0], [NO_ACTION, 0], [DECOMPOSE, 2], [DECOMPOSE, 3], [INVALID, 0]],\n\n // State 1: <L>\n [[NO_ACTION, 0], [NO_ACTION, 1], [COMPOSE, 2], [NO_ACTION, 0], [DECOMPOSE, 2], [DECOMPOSE, 3], [INVALID, 0]],\n\n // State 2: <L,V> or <LV>\n [[NO_ACTION, 0], [NO_ACTION, 1], [NO_ACTION, 0], [COMPOSE, 3], [DECOMPOSE, 2], [DECOMPOSE, 3], [TONE_MARK, 0]],\n\n // State 3: <L,V,T> or <LVT>\n [[NO_ACTION, 0], [NO_ACTION, 1], [NO_ACTION, 0], [NO_ACTION, 0], [DECOMPOSE, 2], [DECOMPOSE, 3], [TONE_MARK, 0]]\n];\n\n/**\n * @param {LayoutFont} font\n * @param {number} code\n * @param {FeatureMap | FeatureInput | null | undefined} features\n * @returns {GlyphInfo}\n */\nfunction getGlyph(font, code, features) {\n let g = font.glyphForCodePoint(code);\n // Callers typically check hasGlyphForCodePoint first; .notdef if somehow missing.\n return new GlyphInfo(font, g ? g.id : 0, [code], features);\n}\n\n/**\n * @param {GlyphInfoLike[]} glyphs\n * @param {number} i\n * @param {LayoutFont} font\n * @returns {number}\n */\nfunction decompose(glyphs, i, font) {\n let glyph = glyphs[i];\n let code = glyph.codePoints[0];\n\n let s = code - HANGUL_BASE;\n let t = T_BASE + s % T_COUNT;\n s = s / T_COUNT | 0;\n let l = L_BASE + s / V_COUNT | 0;\n let v = V_BASE + s % V_COUNT;\n\n // Don't decompose if all of the components are not available\n if (!font.hasGlyphForCodePoint(l)\n || !font.hasGlyphForCodePoint(v)\n || (t !== T_BASE && !font.hasGlyphForCodePoint(t))) {\n return i;\n }\n\n // Replace the current glyph with decomposed L, V, and T glyphs,\n // and apply the proper OpenType features to each component.\n let ljmo = getGlyph(font, l, glyph.features);\n ljmo.features.ljmo = true;\n\n let vjmo = getGlyph(font, v, glyph.features);\n vjmo.features.vjmo = true;\n\n let insert = [ljmo, vjmo];\n\n if (t > T_BASE) {\n let tjmo = getGlyph(font, t, glyph.features);\n tjmo.features.tjmo = true;\n insert.push(tjmo);\n }\n\n glyphs.splice(i, 1, ...insert);\n return i + insert.length - 1;\n}\n\n/**\n * @param {GlyphInfoLike[]} glyphs\n * @param {number} i\n * @param {LayoutFont} font\n * @returns {number}\n */\nfunction compose(glyphs, i, font) {\n let glyph = glyphs[i];\n let code = glyphs[i].codePoints[0];\n let type = getType(code);\n\n let prev = glyphs[i - 1].codePoints[0];\n let prevType = getType(prev);\n\n // Figure out what type of syllable we're dealing with\n /** @type {number | undefined} */\n let lv;\n /** @type {GlyphInfoLike | undefined} */\n let ljmo;\n /** @type {GlyphInfoLike | undefined} */\n let vjmo;\n /** @type {GlyphInfoLike | undefined} */\n let tjmo;\n if (prevType === LV && type === T) {\n // <LV,T>\n lv = prev;\n tjmo = glyph;\n } else {\n if (type === V) {\n // <L,V>\n ljmo = glyphs[i - 1];\n vjmo = glyph;\n } else {\n // <L,V,T>\n ljmo = glyphs[i - 2];\n vjmo = glyphs[i - 1];\n tjmo = glyph;\n }\n\n let l = ljmo.codePoints[0];\n let v = vjmo.codePoints[0];\n\n // Make sure L and V are combining characters\n if (isCombiningL(l) && isCombiningV(v)) {\n lv = HANGUL_BASE + ((l - L_BASE) * V_COUNT + (v - V_BASE)) * T_COUNT;\n }\n }\n\n let t = (tjmo && tjmo.codePoints[0]) || T_BASE;\n if ((lv != null) && (t === T_BASE || isCombiningT(t))) {\n let s = lv + (t - T_BASE);\n\n // Replace with a composed glyph if supported by the font,\n // otherwise apply the proper OpenType features to each component.\n if (font.hasGlyphForCodePoint(s)) {\n let del = prevType === V ? 3 : 2;\n glyphs.splice(i - del + 1, del, getGlyph(font, s, glyph.features));\n return i - del + 1;\n }\n }\n\n // Didn't compose (either a non-combining component or unsupported by font).\n if (ljmo) { ljmo.features.ljmo = true; }\n if (vjmo) { vjmo.features.vjmo = true; }\n if (tjmo) { tjmo.features.tjmo = true; }\n\n if (prevType === LV) {\n // Sequence was originally <L,V>, which got combined earlier.\n // Either the T was non-combining, or the LVT glyph wasn't supported.\n // Decompose the glyph again and apply OT features.\n decompose(glyphs, i - 1, font);\n return i + 1;\n }\n\n return i;\n}\n\n/**\n * Length of the Hangul syllable ending at `code` (for tone-mark reordering).\n * Tone marks only attach to LV/LVT/V/T clusters from the state machine.\n * @param {number} code\n * @returns {number}\n */\nfunction getLength(code) {\n switch (getType(code)) {\n case LV:\n case LVT:\n return 1;\n case V:\n return 2;\n case T:\n return 3;\n default:\n return 1;\n }\n}\n\n/**\n * @param {GlyphInfoLike[]} glyphs\n * @param {number} i\n * @param {LayoutFont} font\n */\nfunction reorderToneMark(glyphs, i, font) {\n let glyph = glyphs[i];\n let code = glyphs[i].codePoints[0];\n\n // Move tone mark to the beginning of the previous syllable, unless it is zero width\n let toneGlyph = font.glyphForCodePoint(code);\n if (!toneGlyph || toneGlyph.advanceWidth === 0) { return; }\n\n let prev = glyphs[i - 1].codePoints[0];\n let len = getLength(prev);\n\n glyphs.splice(i, 1);\n glyphs.splice(i - len, 0, glyph);\n}\n\n/**\n * @param {GlyphInfoLike[]} glyphs\n * @param {number} i\n * @param {LayoutFont} font\n * @returns {number}\n */\nfunction insertDottedCircle(glyphs, i, font) {\n let glyph = glyphs[i];\n let code = glyphs[i].codePoints[0];\n\n if (font.hasGlyphForCodePoint(DOTTED_CIRCLE)) {\n let dottedCircle = getGlyph(font, DOTTED_CIRCLE, glyph.features);\n\n // If the tone mark is zero width, insert the dotted circle before, otherwise after\n let toneGlyph = font.glyphForCodePoint(code);\n let idx = (!toneGlyph || toneGlyph.advanceWidth === 0) ? i : i + 1;\n glyphs.splice(idx, 0, dottedCircle);\n i++;\n }\n\n return i;\n}\n", "import { getCombiningClass } from '../../packages/unicode-properties/index.js';\nimport DefaultShaper from './DefaultShaper';\nimport GlyphInfo from '../GlyphInfo';\n\n/** @typedef {import('../../../types/fontkit').ShapingPlanLike} ShapingPlanLike */\n/** @typedef {import('../../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n/** @typedef {import('../../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../../types/fontkit').OTScriptRecord} OTScriptRecord */\n/** @typedef {import('../../../types/fontkit').OTLangSys} OTLangSys */\n/** @typedef {import('../../../types/fontkit').OTLangSysRecord} OTLangSysRecord */\n\n/**\n * Hebrew shaper (HarfBuzz hb-ot-shaper-hebrew.cc):\n * - Compose presentation forms (FBxx) when the font lacks GPOS mark for `hebr`\n * - Reorder patah/qamats + sheva/hiriq + meteg/below so meteg sits next to the base\n */\nexport default class HebrewShaper extends DefaultShaper {\n /**\n * @param {ShapingPlanLike} plan\n * @param {GlyphInfoLike[]} glyphs\n */\n static assignFeatures(plan, glyphs) {\n super.assignFeatures(plan, glyphs);\n\n if (!hasGposMark(plan.font)) {\n composeHebrew(glyphs, plan.font);\n }\n reorderMarksHebrew(glyphs);\n }\n}\n\n// Dagesh forms for U+05D0..U+05EA (0 = no precomposed form).\nconst DAGESH_FORMS = [\n 0xFB30, 0xFB31, 0xFB32, 0xFB33, 0xFB34, 0xFB35, 0xFB36, 0,\n 0xFB38, 0xFB39, 0xFB3A, 0xFB3B, 0xFB3C, 0, 0xFB3E, 0,\n 0xFB40, 0xFB41, 0, 0xFB43, 0xFB44, 0, 0xFB46, 0xFB47,\n 0xFB48, 0xFB49, 0xFB4A\n];\n\n/**\n * Precomposed Hebrew presentation form for `a + b`, or null (HB compose_hebrew).\n * @param {number} a\n * @param {number} b\n * @returns {number | null}\n */\nfunction composeHebrewPair(a, b) {\n switch (b) {\n case 0x05B4: // HIRIQ\n return a === 0x05D9 ? 0xFB1D : null;\n case 0x05B7: // PATAH\n return a === 0x05F2 ? 0xFB1F : a === 0x05D0 ? 0xFB2E : null;\n case 0x05B8: // QAMATS\n return a === 0x05D0 ? 0xFB2F : null;\n case 0x05B9: // HOLAM\n return a === 0x05D5 ? 0xFB4B : null;\n case 0x05BC: // DAGESH\n if (a >= 0x05D0 && a <= 0x05EA) return DAGESH_FORMS[a - 0x05D0] || null;\n if (a === 0xFB2A) return 0xFB2C;\n if (a === 0xFB2B) return 0xFB2D;\n return null;\n case 0x05BF: // RAFE\n return a === 0x05D1 ? 0xFB4C : a === 0x05DB ? 0xFB4D : a === 0x05E4 ? 0xFB4E : null;\n case 0x05C1: // SHIN DOT\n return a === 0x05E9 ? 0xFB2A : a === 0xFB49 ? 0xFB2C : null;\n case 0x05C2: // SIN DOT\n return a === 0x05E9 ? 0xFB2B : a === 0xFB49 ? 0xFB2D : null;\n default:\n return null;\n }\n}\n\n/**\n * Greedily compose adjacent pairs when the font has the glyph\n * (e.g. SHIN + SHIN_DOT \u2192 FB2A, then + DAGESH \u2192 FB2C).\n * @param {GlyphInfoLike[]} glyphs\n * @param {LayoutFont} font\n */\nfunction composeHebrew(glyphs, font) {\n for (let i = 0; i + 1 < glyphs.length;) {\n let composed = glyphs[i].codePoints[0];\n let consumed = 1;\n while (i + consumed < glyphs.length) {\n let ab = composeHebrewPair(composed, glyphs[i + consumed].codePoints[0]);\n if (ab == null || !font.hasGlyphForCodePoint(ab)) break;\n composed = ab;\n consumed++;\n }\n if (consumed > 1) {\n let composedGlyph = font.glyphForCodePoint(composed);\n if (!composedGlyph) {\n i++;\n continue;\n }\n /** @type {number[]} */\n let cps = [];\n for (let j = 0; j < consumed; j++) cps.push(...glyphs[i + j].codePoints);\n glyphs[i] = new GlyphInfo(font, composedGlyph.id, cps, glyphs[i].features);\n glyphs.splice(i + 1, consumed - 1);\n }\n i++;\n }\n}\n\n/**\n * HB reorder_marks_hebrew: [patah/qamats, sheva/hiriq, meteg/below] \u2192 swap last two.\n * unicode-properties already exposes Hebrew modified CCCs (CCC10/14/17/18/22).\n * @param {GlyphInfoLike[]} glyphs\n */\nfunction reorderMarksHebrew(glyphs) {\n for (let i = 2; i < glyphs.length; i++) {\n let c0 = getCombiningClass(glyphs[i - 2].codePoints[0]);\n let c1 = getCombiningClass(glyphs[i - 1].codePoints[0]);\n let c2 = getCombiningClass(glyphs[i].codePoints[0]);\n if (\n (c0 === 'CCC17' || c0 === 'CCC18')\n && (c1 === 'CCC10' || c1 === 'CCC14')\n && (c2 === 'CCC22' || c2 === 'Below')\n ) {\n [glyphs[i - 1], glyphs[i]] = [glyphs[i], glyphs[i - 1]];\n break;\n }\n }\n}\n\n/**\n * Gate fallback composition on Hebrew-script GPOS `mark` (not the global featureList).\n * @param {LayoutFont} font\n * @returns {boolean}\n */\nfunction hasGposMark(font) {\n let hebr = font.GPOS?.scriptList?.find(/** @param {OTScriptRecord} e */ e => e.tag === 'hebr')?.script;\n if (!hebr) return false;\n\n let langs = [hebr.defaultLangSys, ...(hebr.langSysRecords || []).map(/** @param {OTLangSysRecord} l */ l => l.langSys)]\n .filter(/** @returns {value is OTLangSys} */ (/** @type {OTLangSys | null} */ value) => value != null);\n return langs.some(/** @param {OTLangSys} ls */ ls =>\n (ls.featureIndexes || []).some(/** @param {number} i */ i => font.GPOS?.featureList[i]?.tag === 'mark')\n );\n}\n", "import DefaultShaper from './DefaultShaper';\nimport StateMachine from 'dfa';\nimport UnicodeTrie from '../../packages/unicode-trie/index.js';\nimport { getCategory } from '../../packages/unicode-properties/index.js';\nimport * as Script from '../../layout/Script';\nimport GlyphInfo from '../GlyphInfo';\nimport indicMachine from './indic.json';\nimport useData from './use.json';\nimport {\n CATEGORIES,\n POSITIONS,\n CONSONANT_FLAGS,\n JOINER_FLAGS,\n HALANT_OR_COENG_FLAGS, INDIC_CONFIGS,\n INDIC_DECOMPOSITIONS\n} from './indic-data';\nimport { decodeBase64 } from '../../utils';\nimport indicTrie from './indic.trie';\n\n/** @typedef {import('../../../types/fontkit').ShapingPlanLike} ShapingPlanLike */\n/** @typedef {import('../../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n/** @typedef {import('../../../types/fontkit').IndicGlyphInfo} IndicGlyphInfo */\n/** @typedef {import('../../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../../types/fontkit').IndicConfig} IndicConfig */\n/** @typedef {import('../../../types/fontkit').IndicShaperInfo} IndicShaperInfo */\n/** @typedef {import('../../../types/fontkit').ShapingStageFn} ShapingStageFn */\n/** @typedef {import('dfa').StateMachineDefinition} StateMachineDefinition */\n\n/**\n * @typedef {{ decompositions: Record<string, number[]> }} UseDataPartial\n */\n\n/** @type {UseDataPartial} */\nconst useDataTyped = /** @type {UseDataPartial} */ (useData);\nconst { decompositions } = useDataTyped;\nconst trie = new UnicodeTrie(decodeBase64(indicTrie));\nconst stateMachine = new StateMachine(/** @type {StateMachineDefinition} */ (indicMachine));\n\n/**\n * The IndicShaper supports indic scripts e.g. Devanagari, Kannada, etc.\n * Based on code from Harfbuzz: https://github.com/behdad/harfbuzz/blob/master/src/hb-ot-shape-complex-indic.cc\n */\nexport default class IndicShaper extends DefaultShaper {\n static zeroMarkWidths = 'NONE';\n\n /**\n * @param {ShapingPlanLike} plan\n */\n static planFeatures(plan) {\n plan.addStage(setupSyllables);\n\n plan.addStage(['locl', 'ccmp']);\n\n plan.addStage(initialReordering);\n\n plan.addStage('nukt');\n plan.addStage('akhn');\n plan.addStage('rphf', false);\n plan.addStage('rkrf');\n plan.addStage('pref', false);\n plan.addStage('blwf', false);\n plan.addStage('abvf', false);\n plan.addStage('half', false);\n plan.addStage('pstf', false);\n plan.addStage('vatu');\n plan.addStage('cjct');\n plan.addStage('cfar', false);\n\n plan.addStage(finalReordering);\n\n plan.addStage({\n local: ['init'],\n global: ['pres', 'abvs', 'blws', 'psts', 'haln', 'dist', 'abvm', 'blwm', 'calt', 'clig']\n });\n\n // Setup the indic config for the selected script\n let scriptTag = Array.isArray(plan.script) ? plan.script[0] : plan.script;\n plan.unicodeScript = scriptTag != null ? Script.fromOpenType(scriptTag) : undefined;\n /** @type {Record<string, IndicConfig>} */\n let configs = INDIC_CONFIGS;\n plan.indicConfig = (plan.unicodeScript && configs[plan.unicodeScript]) || configs.Default;\n let scriptKey = Array.isArray(plan.script)\n ? plan.script[plan.script.length - 1]\n : plan.script;\n plan.isOldSpec = !!(plan.indicConfig.hasOldSpec && scriptKey != null && scriptKey[scriptKey.length - 1] !== '2');\n\n // TODO: turn off kern (Khmer) and liga features.\n }\n\n /**\n * @param {ShapingPlanLike} plan\n * @param {GlyphInfoLike[]} glyphs\n */\n static assignFeatures(plan, glyphs) {\n // Decompose split matras\n // TODO: do this in a more general unicode normalizer\n for (let i = glyphs.length - 1; i >= 0; i--) {\n let codepoint = glyphs[i].codePoints[0];\n let d = /** @type {Record<number, number[]>} */ (INDIC_DECOMPOSITIONS)[codepoint]\n || decompositions[String(codepoint)];\n if (d) {\n /** @type {GlyphInfo[]} */\n let decomposed = [];\n for (let c of d) {\n let g = plan.font.glyphForCodePoint(c);\n if (g) {\n decomposed.push(new GlyphInfo(plan.font, g.id, [c], glyphs[i].features));\n }\n }\n\n glyphs.splice(i, 1, ...decomposed);\n }\n }\n }\n}\n\n/**\n * @param {GlyphInfoLike} glyph\n * @returns {number}\n */\nfunction indicCategory(glyph) {\n return trie.get(glyph.codePoints[0]) >> 8;\n}\n\n/**\n * @param {GlyphInfoLike} glyph\n * @returns {number}\n */\nfunction indicPosition(glyph) {\n return 1 << (trie.get(glyph.codePoints[0]) & 0xff);\n}\n\nclass IndicInfo {\n /**\n * @param {number} category\n * @param {number} position\n * @param {string} syllableType\n * @param {number} syllable\n */\n constructor(category, position, syllableType, syllable) {\n /** @type {number} */\n this.category = category;\n /** @type {number} */\n this.position = position;\n /** @type {string} */\n this.syllableType = syllableType;\n /** @type {number} */\n this.syllable = syllable;\n }\n}\n\n/**\n * @param {import('../../../types/fontkit').IndicShaperInfo | import('../../../types/fontkit').USEShaperInfo | null} info\n * @returns {info is IndicShaperInfo}\n */\nfunction isIndicShaperInfo(info) {\n // Discriminate on category kind: Indic uses numeric bitflags, USE uses strings.\n return info != null && typeof info.category === 'number';\n}\n\n/**\n * @param {GlyphInfoLike} glyph\n * @returns {IndicShaperInfo}\n */\nfunction indicInfo(glyph) {\n let info = glyph.shaperInfo;\n if (!isIndicShaperInfo(info)) {\n throw new Error('Expected Indic shaperInfo');\n }\n return info;\n}\n\n/** @type {ShapingStageFn} */\nfunction setupSyllables(font, glyphs) {\n let syllable = 0;\n let last = 0;\n for (let [start, end, tags] of stateMachine.match(glyphs.map(indicCategory))) {\n if (start > last) {\n ++syllable;\n for (let i = last; i < start; i++) {\n glyphs[i].shaperInfo = new IndicInfo(CATEGORIES.X, POSITIONS.End, 'non_indic_cluster', syllable);\n }\n }\n\n ++syllable;\n\n // Create shaper info\n for (let i = start; i <= end; i++) {\n glyphs[i].shaperInfo = new IndicInfo(\n 1 << indicCategory(glyphs[i]),\n indicPosition(glyphs[i]),\n tags[0],\n syllable\n );\n }\n\n last = end + 1;\n }\n\n if (last < glyphs.length) {\n ++syllable;\n for (let i = last; i < glyphs.length; i++) {\n glyphs[i].shaperInfo = new IndicInfo(CATEGORIES.X, POSITIONS.End, 'non_indic_cluster', syllable);\n }\n }\n}\n\n/**\n * @param {GlyphInfoLike} glyph\n * @returns {number}\n */\nfunction isConsonant(glyph) {\n return indicInfo(glyph).category & CONSONANT_FLAGS;\n}\n\n/**\n * @param {GlyphInfoLike} glyph\n * @returns {number}\n */\nfunction isJoiner(glyph) {\n return indicInfo(glyph).category & JOINER_FLAGS;\n}\n\n/**\n * @param {GlyphInfoLike} glyph\n * @returns {number}\n */\nfunction isHalantOrCoeng(glyph) {\n return indicInfo(glyph).category & HALANT_OR_COENG_FLAGS;\n}\n\n/**\n * @param {GlyphInfoLike[]} glyphs\n * @param {string} feature\n * @returns {boolean}\n */\nfunction wouldSubstitute(glyphs, feature) {\n for (let glyph of glyphs) {\n glyph.features = { [feature]: true };\n }\n\n let engine = glyphs[0]._font._layoutEngine.engine;\n if (!engine?.GSUBProcessor) {\n return false;\n }\n engine.GSUBProcessor.applyFeatures([feature], glyphs);\n\n return glyphs.length === 1;\n}\n\n/**\n * @param {LayoutFont} font\n * @param {GlyphInfoLike} consonant\n * @param {GlyphInfoLike} virama\n * @returns {number}\n */\nfunction consonantPosition(font, consonant, virama) {\n let glyphs = [virama, consonant, virama];\n if (wouldSubstitute(glyphs.slice(0, 2), 'blwf') || wouldSubstitute(glyphs.slice(1, 3), 'blwf')) {\n return POSITIONS.Below_C;\n } else if (wouldSubstitute(glyphs.slice(0, 2), 'pstf') || wouldSubstitute(glyphs.slice(1, 3), 'pstf')) {\n return POSITIONS.Post_C;\n } else if (wouldSubstitute(glyphs.slice(0, 2), 'pref') || wouldSubstitute(glyphs.slice(1, 3), 'pref')) {\n return POSITIONS.Post_C;\n }\n\n return POSITIONS.Base_C;\n}\n\n/** @type {ShapingStageFn} */\nfunction initialReordering(font, glyphsArg, plan) {\n // setupSyllables always attaches IndicShaperInfo before this stage.\n const glyphs = /** @type {IndicGlyphInfo[]} */ (glyphsArg);\n let indicConfig = /** @type {IndicConfig} */ (plan.indicConfig);\n let engine = font._layoutEngine.engine;\n let features = engine?.GSUBProcessor ? engine.GSUBProcessor.features : {};\n\n let dottedCircleGlyph = font.glyphForCodePoint(0x25cc);\n let dottedCircle = dottedCircleGlyph ? dottedCircleGlyph.id : 0;\n let viramaGlyph = font.glyphForCodePoint(indicConfig.virama);\n let virama = viramaGlyph ? viramaGlyph.id : 0;\n if (virama) {\n let info = new GlyphInfo(font, virama, [indicConfig.virama]);\n for (let i = 0; i < glyphs.length; i++) {\n if (glyphs[i].shaperInfo.position === POSITIONS.Base_C) {\n glyphs[i].shaperInfo.position = consonantPosition(font, glyphs[i].copy(), info);\n }\n }\n }\n\n for (let start = 0, end = nextSyllable(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable(glyphs, start)) {\n let { syllableType } = glyphs[start].shaperInfo;\n\n if (syllableType === 'symbol_cluster' || syllableType === 'non_indic_cluster') {\n continue;\n }\n\n if (syllableType === 'broken_cluster' && dottedCircle) {\n let g = /** @type {IndicGlyphInfo} */ (new GlyphInfo(font, dottedCircle, [0x25cc]));\n g.shaperInfo = new IndicInfo(\n 1 << indicCategory(g),\n indicPosition(g),\n glyphs[start].shaperInfo.syllableType,\n glyphs[start].shaperInfo.syllable\n );\n\n // Insert after possible Repha.\n let i = start;\n while (i < end && glyphs[i].shaperInfo.category === CATEGORIES.Repha) {\n i++;\n }\n\n glyphs.splice(i, 0, g);\n end++;\n }\n\n // 1. Find base consonant:\n //\n // The shaping engine finds the base consonant of the syllable, using the\n // following algorithm: starting from the end of the syllable, move backwards\n // until a consonant is found that does not have a below-base or post-base\n // form (post-base forms have to follow below-base forms), or that is not a\n // pre-base reordering Ra, or arrive at the first consonant. The consonant\n // stopped at will be the base.\n\n let base = end;\n let limit = start;\n let hasReph = false;\n\n // If the syllable starts with Ra + Halant (in a script that has Reph)\n // and has more than one consonant, Ra is excluded from candidates for\n // base consonants.\n if (indicConfig.rephPos !== POSITIONS.Ra_To_Become_Reph\n && features.rphf\n && start + 3 <= end && (\n (indicConfig.rephMode === 'Implicit' && !isJoiner(glyphs[start + 2]))\n || (indicConfig.rephMode === 'Explicit' && glyphs[start + 2].shaperInfo.category === CATEGORIES.ZWJ)\n )\n ) {\n // See if it matches the 'rphf' feature.\n let g = [glyphs[start].copy(), glyphs[start + 1].copy(), glyphs[start + 2].copy()];\n if (wouldSubstitute(g.slice(0, 2), 'rphf') || (indicConfig.rephMode === 'Explicit' && wouldSubstitute(g, 'rphf'))) {\n limit += 2;\n while (limit < end && isJoiner(glyphs[limit])) {\n limit++;\n }\n base = start;\n hasReph = true;\n }\n } else if (indicConfig.rephMode === 'Log_Repha' && glyphs[start].shaperInfo.category === CATEGORIES.Repha) {\n limit++;\n while (limit < end && isJoiner(glyphs[limit])) {\n limit++;\n }\n base = start;\n hasReph = true;\n }\n\n switch (indicConfig.basePos) {\n case 'Last': {\n // starting from the end of the syllable, move backwards\n let i = end;\n let seenBelow = false;\n\n do {\n let info = glyphs[--i].shaperInfo;\n\n // until a consonant is found\n if (isConsonant(glyphs[i])) {\n // that does not have a below-base or post-base form\n // (post-base forms have to follow below-base forms),\n if (info.position !== POSITIONS.Below_C && (info.position !== POSITIONS.Post_C || seenBelow)) {\n base = i;\n break;\n }\n\n // or that is not a pre-base reordering Ra,\n //\n // IMPLEMENTATION NOTES:\n //\n // Our pre-base reordering Ra's are marked POS_POST_C, so will be skipped\n // by the logic above already.\n //\n\n // or arrive at the first consonant. The consonant stopped at will\n // be the base.\n if (info.position === POSITIONS.Below_C) {\n seenBelow = true;\n }\n\n base = i;\n } else if (start < i && info.category === CATEGORIES.ZWJ && glyphs[i - 1].shaperInfo.category === CATEGORIES.H) {\n // A ZWJ after a Halant stops the base search, and requests an explicit\n // half form.\n // A ZWJ before a Halant, requests a subjoined form instead, and hence\n // search continues. This is particularly important for Bengali\n // sequence Ra,H,Ya that should form Ya-Phalaa by subjoining Ya.\n break;\n }\n } while (i > limit);\n break;\n }\n\n case 'First': {\n // The first consonant is always the base.\n base = start;\n\n // Mark all subsequent consonants as below.\n for (let i = base + 1; i < end; i++) {\n if (isConsonant(glyphs[i])) {\n glyphs[i].shaperInfo.position = POSITIONS.Below_C;\n }\n }\n }\n }\n\n // If the syllable starts with Ra + Halant (in a script that has Reph)\n // and has more than one consonant, Ra is excluded from candidates for\n // base consonants.\n //\n // Only do this for unforced Reph. (ie. not for Ra,H,ZWJ)\n if (hasReph && base === start && limit - base <= 2) {\n hasReph = false;\n }\n\n // 2. Decompose and reorder Matras:\n //\n // Each matra and any syllable modifier sign in the cluster are moved to the\n // appropriate position relative to the consonant(s) in the cluster. The\n // shaping engine decomposes two- or three-part matras into their constituent\n // parts before any repositioning. Matra characters are classified by which\n // consonant in a conjunct they have affinity for and are reordered to the\n // following positions:\n //\n // o Before first half form in the syllable\n // o After subjoined consonants\n // o After post-form consonant\n // o After main consonant (for above marks)\n //\n // IMPLEMENTATION NOTES:\n //\n // The normalize() routine has already decomposed matras for us, so we don't\n // need to worry about that.\n\n // 3. Reorder marks to canonical order:\n //\n // Adjacent nukta and halant or nukta and vedic sign are always repositioned\n // if necessary, so that the nukta is first.\n //\n // IMPLEMENTATION NOTES:\n //\n // We don't need to do this: the normalize() routine already did this for us.\n\n // Reorder characters\n\n for (let i = start; i < base; i++) {\n let info = glyphs[i].shaperInfo;\n info.position = Math.min(POSITIONS.Pre_C, info.position);\n }\n\n if (base < end) {\n glyphs[base].shaperInfo.position = POSITIONS.Base_C;\n }\n\n // Mark final consonants. A final consonant is one appearing after a matra,\n // like in Khmer.\n for (let i = base + 1; i < end; i++) {\n if (glyphs[i].shaperInfo.category === CATEGORIES.M) {\n for (let j = i + 1; j < end; j++) {\n if (isConsonant(glyphs[j])) {\n glyphs[j].shaperInfo.position = POSITIONS.Final_C;\n break;\n }\n }\n break;\n }\n }\n\n // Handle beginning Ra\n if (hasReph) {\n glyphs[start].shaperInfo.position = POSITIONS.Ra_To_Become_Reph;\n }\n\n // For old-style Indic script tags, move the first post-base Halant after\n // last consonant.\n //\n // Reports suggest that in some scripts Uniscribe does this only if there\n // is *not* a Halant after last consonant already (eg. Kannada), while it\n // does it unconditionally in other scripts (eg. Malayalam). We don't\n // currently know about other scripts, so we single out Malayalam for now.\n //\n // Kannada test case:\n // U+0C9A,U+0CCD,U+0C9A,U+0CCD\n // With some versions of Lohit Kannada.\n // https://bugs.freedesktop.org/show_bug.cgi?id=59118\n //\n // Malayalam test case:\n // U+0D38,U+0D4D,U+0D31,U+0D4D,U+0D31,U+0D4D\n // With lohit-ttf-20121122/Lohit-Malayalam.ttf\n if (plan.isOldSpec) {\n let disallowDoubleHalants = plan.unicodeScript !== 'Malayalam';\n for (let i = base + 1; i < end; i++) {\n if (glyphs[i].shaperInfo.category === CATEGORIES.H) {\n let j;\n for (j = end - 1; j > i; j--) {\n if (isConsonant(glyphs[j]) || (disallowDoubleHalants && glyphs[j].shaperInfo.category === CATEGORIES.H)) {\n break;\n }\n }\n\n if (glyphs[j].shaperInfo.category !== CATEGORIES.H && j > i) {\n // Move Halant to after last consonant.\n let t = glyphs[i];\n glyphs.splice(i, 0, ...glyphs.splice(i + 1, j - i));\n glyphs[j] = t;\n }\n\n break;\n }\n }\n }\n\n // Attach misc marks to previous char to move with them.\n let lastPos = POSITIONS.Start;\n for (let i = start; i < end; i++) {\n let info = glyphs[i].shaperInfo;\n if (info.category & (JOINER_FLAGS | CATEGORIES.N | CATEGORIES.RS | CATEGORIES.CM | HALANT_OR_COENG_FLAGS & info.category)) {\n info.position = lastPos;\n if (info.category === CATEGORIES.H && info.position === POSITIONS.Pre_M) {\n // Uniscribe doesn't move the Halant with Left Matra.\n // TEST: U+092B,U+093F,U+094DE\n // We follow. This is important for the Sinhala\n // U+0DDA split matra since it decomposes to U+0DD9,U+0DCA\n // where U+0DD9 is a left matra and U+0DCA is the virama.\n // We don't want to move the virama with the left matra.\n // TEST: U+0D9A,U+0DDA\n for (let j = i; j > start; j--) {\n if (glyphs[j - 1].shaperInfo.position !== POSITIONS.Pre_M) {\n info.position = glyphs[j - 1].shaperInfo.position;\n break;\n }\n }\n }\n } else if (info.position !== POSITIONS.SMVD) {\n lastPos = info.position;\n }\n }\n\n // For post-base consonants let them own anything before them\n // since the last consonant or matra.\n let last = base;\n for (let i = base + 1; i < end; i++) {\n if (isConsonant(glyphs[i])) {\n for (let j = last + 1; j < i; j++) {\n if (glyphs[j].shaperInfo.position < POSITIONS.SMVD) {\n glyphs[j].shaperInfo.position = glyphs[i].shaperInfo.position;\n }\n }\n last = i;\n } else if (glyphs[i].shaperInfo.category === CATEGORIES.M) {\n last = i;\n }\n }\n\n let arr = glyphs.slice(start, end);\n arr.sort((a, b) => a.shaperInfo.position - b.shaperInfo.position);\n glyphs.splice(start, arr.length, ...arr);\n\n // Find base again\n for (let i = start; i < end; i++) {\n if (glyphs[i].shaperInfo.position === POSITIONS.Base_C) {\n base = i;\n break;\n }\n }\n\n // Setup features now\n\n // Reph\n for (let i = start; i < end && glyphs[i].shaperInfo.position === POSITIONS.Ra_To_Become_Reph; i++) {\n glyphs[i].features.rphf = true;\n }\n\n // Pre-base\n let blwf = !plan.isOldSpec && indicConfig.blwfMode === 'Pre_And_Post';\n for (let i = start; i < base; i++) {\n glyphs[i].features.half = true;\n if (blwf) {\n glyphs[i].features.blwf = true;\n }\n }\n\n // Post-base\n for (let i = base + 1; i < end; i++) {\n glyphs[i].features.abvf = true;\n glyphs[i].features.pstf = true;\n glyphs[i].features.blwf = true;\n }\n\n if (plan.isOldSpec && plan.unicodeScript === 'Devanagari') {\n // Old-spec eye-lash Ra needs special handling. From the\n // spec:\n //\n // \"The feature 'below-base form' is applied to consonants\n // having below-base forms and following the base consonant.\n // The exception is vattu, which may appear below half forms\n // as well as below the base glyph. The feature 'below-base\n // form' will be applied to all such occurrences of Ra as well.\"\n //\n // Test case: U+0924,U+094D,U+0930,U+094d,U+0915\n // with Sanskrit 2003 font.\n //\n // However, note that Ra,Halant,ZWJ is the correct way to\n // request eyelash form of Ra, so we wouldbn't inhibit it\n // in that sequence.\n //\n // Test case: U+0924,U+094D,U+0930,U+094d,U+200D,U+0915\n for (let i = start; i + 1 < base; i++) {\n if (glyphs[i].shaperInfo.category === CATEGORIES.Ra\n && glyphs[i + 1].shaperInfo.category === CATEGORIES.H\n && (i + 1 === base || glyphs[i + 2].shaperInfo.category === CATEGORIES.ZWJ)\n ) {\n glyphs[i].features.blwf = true;\n glyphs[i + 1].features.blwf = true;\n }\n }\n }\n\n let prefLen = 2;\n if (features.pref && base + prefLen < end) {\n // Find a Halant,Ra sequence and mark it for pre-base reordering processing.\n for (let i = base + 1; i + prefLen - 1 < end; i++) {\n let g = [glyphs[i].copy(), glyphs[i + 1].copy()];\n if (wouldSubstitute(g, 'pref')) {\n for (let j = 0; j < prefLen; j++) {\n glyphs[i++].features.pref = true;\n }\n\n // Mark the subsequent stuff with 'cfar'. Used in Khmer.\n // Read the feature spec.\n // This allows distinguishing the following cases with MS Khmer fonts:\n // U+1784,U+17D2,U+179A,U+17D2,U+1782\n // U+1784,U+17D2,U+1782,U+17D2,U+179A\n if (features.cfar) {\n for (; i < end; i++) {\n glyphs[i].features.cfar = true;\n }\n }\n\n break;\n }\n }\n }\n\n // Apply ZWJ/ZWNJ effects\n for (let i = start + 1; i < end; i++) {\n if (isJoiner(glyphs[i])) {\n let nonJoiner = glyphs[i].shaperInfo.category === CATEGORIES.ZWNJ;\n let j = i;\n\n do {\n j--;\n\n // ZWJ/ZWNJ should disable CJCT. They do that by simply\n // being there, since we don't skip them for the CJCT\n // feature (ie. F_MANUAL_ZWJ)\n\n // A ZWNJ disables HALF.\n if (nonJoiner) {\n delete glyphs[j].features.half;\n }\n } while (j > start && !isConsonant(glyphs[j]));\n }\n }\n }\n}\n\n/** @type {ShapingStageFn} */\nfunction finalReordering(font, glyphsArg, plan) {\n // setupSyllables / initialReordering always attach IndicShaperInfo before this stage.\n const glyphs = /** @type {IndicGlyphInfo[]} */ (glyphsArg);\n let indicConfig = /** @type {IndicConfig} */ (plan.indicConfig);\n let engine = font._layoutEngine.engine;\n let features = engine?.GSUBProcessor ? engine.GSUBProcessor.features : {};\n\n for (let start = 0, end = nextSyllable(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable(glyphs, start)) {\n // 4. Final reordering:\n //\n // After the localized forms and basic shaping forms GSUB features have been\n // applied (see below), the shaping engine performs some final glyph\n // reordering before applying all the remaining font features to the entire\n // cluster.\n\n let tryPref = !!features.pref;\n\n // Find base again\n let base = start;\n for (; base < end; base++) {\n if (glyphs[base].shaperInfo.position >= POSITIONS.Base_C) {\n if (tryPref && base + 1 < end) {\n for (let i = base + 1; i < end; i++) {\n if (glyphs[i].features.pref) {\n if (!(glyphs[i].substituted && glyphs[i].isLigated && !glyphs[i].isMultiplied)) {\n // Ok, this was a 'pref' candidate but didn't form any.\n // Base is around here...\n base = i;\n while (base < end && isHalantOrCoeng(glyphs[base])) {\n base++;\n }\n glyphs[base].shaperInfo.position = POSITIONS.Base_C;\n tryPref = false;\n }\n break;\n }\n }\n }\n\n // For Malayalam, skip over unformed below- (but NOT post-) forms.\n if (plan.unicodeScript === 'Malayalam') {\n for (let i = base + 1; i < end; i++) {\n while (i < end && isJoiner(glyphs[i])) {\n i++;\n }\n\n if (i === end || !isHalantOrCoeng(glyphs[i])) {\n break;\n }\n\n i++; // Skip halant.\n while (i < end && isJoiner(glyphs[i])) {\n i++;\n }\n\n if (i < end && isConsonant(glyphs[i]) && glyphs[i].shaperInfo.position === POSITIONS.Below_C) {\n base = i;\n glyphs[base].shaperInfo.position = POSITIONS.Base_C;\n }\n }\n }\n\n if (start < base && glyphs[base].shaperInfo.position > POSITIONS.Base_C) {\n base--;\n }\n break;\n }\n }\n\n if (base === end && start < base && glyphs[base - 1].shaperInfo.category === CATEGORIES.ZWJ) {\n base--;\n }\n\n if (base < end) {\n while (start < base && glyphs[base].shaperInfo.category & (CATEGORIES.N | HALANT_OR_COENG_FLAGS)) {\n base--;\n }\n }\n\n // o Reorder matras:\n //\n // If a pre-base matra character had been reordered before applying basic\n // features, the glyph can be moved closer to the main consonant based on\n // whether half-forms had been formed. Actual position for the matra is\n // defined as \u201Cafter last standalone halant glyph, after initial matra\n // position and before the main consonant\u201D. If ZWJ or ZWNJ follow this\n // halant, position is moved after it.\n //\n\n if (start + 1 < end && start < base) { // Otherwise there can't be any pre-base matra characters.\n // If we lost track of base, alas, position before last thingy.\n let newPos = base === end ? base - 2 : base - 1;\n\n // Malayalam / Tamil do not have \"half\" forms or explicit virama forms.\n // The glyphs formed by 'half' are Chillus or ligated explicit viramas.\n // We want to position matra after them.\n if (plan.unicodeScript !== 'Malayalam' && plan.unicodeScript !== 'Tamil') {\n while (newPos > start && !(glyphs[newPos].shaperInfo.category & (CATEGORIES.M | HALANT_OR_COENG_FLAGS))) {\n newPos--;\n }\n\n // If we found no Halant we are done.\n // Otherwise only proceed if the Halant does\n // not belong to the Matra itself!\n if (isHalantOrCoeng(glyphs[newPos]) && glyphs[newPos].shaperInfo.position !== POSITIONS.Pre_M) {\n // If ZWJ or ZWNJ follow this halant, position is moved after it.\n if (newPos + 1 < end && isJoiner(glyphs[newPos + 1])) {\n newPos++;\n }\n } else {\n newPos = start; // No move.\n }\n }\n\n if (start < newPos && glyphs[newPos].shaperInfo.position !== POSITIONS.Pre_M) {\n // Now go see if there's actually any matras...\n for (let i = newPos; i > start; i--) {\n if (glyphs[i - 1].shaperInfo.position === POSITIONS.Pre_M) {\n let oldPos = i - 1;\n if (oldPos < base && base <= newPos) { // Shouldn't actually happen.\n base--;\n }\n\n let tmp = glyphs[oldPos];\n glyphs.splice(oldPos, 0, ...glyphs.splice(oldPos + 1, newPos - oldPos));\n glyphs[newPos] = tmp;\n\n newPos--;\n }\n }\n }\n }\n\n // o Reorder reph:\n //\n // Reph\u2019s original position is always at the beginning of the syllable,\n // (i.e. it is not reordered at the character reordering stage). However,\n // it will be reordered according to the basic-forms shaping results.\n // Possible positions for reph, depending on the script, are; after main,\n // before post-base consonant forms, and after post-base consonant forms.\n\n // Two cases:\n //\n // - If repha is encoded as a sequence of characters (Ra,H or Ra,H,ZWJ), then\n // we should only move it if the sequence ligated to the repha form.\n //\n // - If repha is encoded separately and in the logical position, we should only\n // move it if it did NOT ligate. If it ligated, it's probably the font trying\n // to make it work without the reordering.\n if (start + 1 < end\n && glyphs[start].shaperInfo.position === POSITIONS.Ra_To_Become_Reph\n && (glyphs[start].shaperInfo.category === CATEGORIES.Repha) !== (glyphs[start].isLigated && !glyphs[start].isMultiplied)\n ) {\n let newRephPos = end - 1;\n let rephPos = indicConfig.rephPos;\n let found = false;\n\n // 1. If reph should be positioned after post-base consonant forms,\n // proceed to step 5.\n if (rephPos !== POSITIONS.After_Post) {\n // 2. If the reph repositioning class is not after post-base: target\n // position is after the first explicit halant glyph between the\n // first post-reph consonant and last main consonant. If ZWJ or ZWNJ\n // are following this halant, position is moved after it. If such\n // position is found, this is the target position. Otherwise,\n // proceed to the next step.\n //\n // Note: in old-implementation fonts, where classifications were\n // fixed in shaping engine, there was no case where reph position\n // will be found on this step.\n newRephPos = start + 1;\n while (newRephPos < base && !isHalantOrCoeng(glyphs[newRephPos])) {\n newRephPos++;\n }\n\n if (newRephPos < base && isHalantOrCoeng(glyphs[newRephPos])) {\n // ->If ZWJ or ZWNJ are following this halant, position is moved after it.\n if (newRephPos + 1 < base && isJoiner(glyphs[newRephPos + 1])) {\n newRephPos++;\n }\n\n found = true;\n }\n\n // 3. If reph should be repositioned after the main consonant: find the\n // first consonant not ligated with main, or find the first\n // consonant that is not a potential pre-base reordering Ra.\n if (!found && rephPos === POSITIONS.After_Main) {\n newRephPos = base;\n while (newRephPos + 1 < end && glyphs[newRephPos + 1].shaperInfo.position <= POSITIONS.After_Main) {\n newRephPos++;\n }\n\n found = newRephPos < end;\n }\n\n // 4. If reph should be positioned before post-base consonant, find\n // first post-base classified consonant not ligated with main. If no\n // consonant is found, the target position should be before the\n // first matra, syllable modifier sign or vedic sign.\n //\n // This is our take on what step 4 is trying to say (and failing, BADLY).\n if (!found && rephPos === POSITIONS.After_Sub) {\n newRephPos = base;\n while (newRephPos + 1 < end && !(glyphs[newRephPos + 1].shaperInfo.position & (POSITIONS.Post_C | POSITIONS.After_Post | POSITIONS.SMVD))) {\n newRephPos++;\n }\n\n found = newRephPos < end;\n }\n }\n\n // 5. If no consonant is found in steps 3 or 4, move reph to a position\n // immediately before the first post-base matra, syllable modifier\n // sign or vedic sign that has a reordering class after the intended\n // reph position. For example, if the reordering position for reph\n // is post-main, it will skip above-base matras that also have a\n // post-main position.\n if (!found) {\n // Copied from step 2.\n newRephPos = start + 1;\n while (newRephPos < base && !isHalantOrCoeng(glyphs[newRephPos])) {\n newRephPos++;\n }\n\n if (newRephPos < base && isHalantOrCoeng(glyphs[newRephPos])) {\n // ->If ZWJ or ZWNJ are following this halant, position is moved after it.\n if (newRephPos + 1 < base && isJoiner(glyphs[newRephPos + 1])) {\n newRephPos++;\n }\n\n found = true;\n }\n }\n\n // 6. Otherwise, reorder reph to the end of the syllable.\n if (!found) {\n newRephPos = end - 1;\n while (newRephPos > start && glyphs[newRephPos].shaperInfo.position === POSITIONS.SMVD) {\n newRephPos--;\n }\n\n // If the Reph is to be ending up after a Matra,Halant sequence,\n // position it before that Halant so it can interact with the Matra.\n // However, if it's a plain Consonant,Halant we shouldn't do that.\n // Uniscribe doesn't do this.\n // TEST: U+0930,U+094D,U+0915,U+094B,U+094D\n if (isHalantOrCoeng(glyphs[newRephPos])) {\n for (let i = base + 1; i < newRephPos; i++) {\n if (glyphs[i].shaperInfo.category === CATEGORIES.M) {\n newRephPos--;\n }\n }\n }\n }\n\n let reph = glyphs[start];\n glyphs.splice(start, 0, ...glyphs.splice(start + 1, newRephPos - start));\n glyphs[newRephPos] = reph;\n\n if (start < base && base <= newRephPos) {\n base--;\n }\n }\n\n // o Reorder pre-base reordering consonants:\n //\n // If a pre-base reordering consonant is found, reorder it according to\n // the following rules:\n if (tryPref && base + 1 < end) {\n for (let i = base + 1; i < end; i++) {\n if (glyphs[i].features.pref) {\n // 1. Only reorder a glyph produced by substitution during application\n // of the <pref> feature. (Note that a font may shape a Ra consonant with\n // the feature generally but block it in certain contexts.)\n\n // Note: We just check that something got substituted. We don't check that\n // the <pref> feature actually did it...\n //\n // Reorder pref only if it ligated.\n if (glyphs[i].isLigated && !glyphs[i].isMultiplied) {\n // 2. Try to find a target position the same way as for pre-base matra.\n // If it is found, reorder pre-base consonant glyph.\n //\n // 3. If position is not found, reorder immediately before main\n // consonant.\n let newPos = base;\n\n // Malayalam / Tamil do not have \"half\" forms or explicit virama forms.\n // The glyphs formed by 'half' are Chillus or ligated explicit viramas.\n // We want to position matra after them.\n if (plan.unicodeScript !== 'Malayalam' && plan.unicodeScript !== 'Tamil') {\n while (newPos > start && !(glyphs[newPos - 1].shaperInfo.category & (CATEGORIES.M | HALANT_OR_COENG_FLAGS))) {\n newPos--;\n }\n\n // In Khmer coeng model, a H,Ra can go *after* matras. If it goes after a\n // split matra, it should be reordered to *before* the left part of such matra.\n if (newPos > start && glyphs[newPos - 1].shaperInfo.category === CATEGORIES.M) {\n let oldPos = i;\n for (let j = base + 1; j < oldPos; j++) {\n if (glyphs[j].shaperInfo.category === CATEGORIES.M) {\n newPos--;\n break;\n }\n }\n }\n }\n\n if (newPos > start && isHalantOrCoeng(glyphs[newPos - 1])) {\n // -> If ZWJ or ZWNJ follow this halant, position is moved after it.\n if (newPos < end && isJoiner(glyphs[newPos])) {\n newPos++;\n }\n }\n\n let oldPos = i;\n let tmp = glyphs[oldPos];\n glyphs.splice(newPos + 1, 0, ...glyphs.splice(newPos, oldPos - newPos));\n glyphs[newPos] = tmp;\n\n if (newPos <= base && base < oldPos) {\n // harfbuzz keeps base for later steps; unused here\n // eslint-disable-next-line no-useless-assignment\n base++;\n }\n }\n\n break;\n }\n }\n }\n\n // Apply 'init' to the Left Matra if it's a word start.\n if (glyphs[start].shaperInfo.position === POSITIONS.Pre_M && (!start || !/Cf|Mn/.test(getCategory(glyphs[start - 1].codePoints[0])))) {\n glyphs[start].features.init = true;\n }\n }\n}\n\n/**\n * @param {IndicGlyphInfo[]} glyphs\n * @param {number} start\n * @returns {number}\n */\nfunction nextSyllable(glyphs, start) {\n if (start >= glyphs.length) return start;\n let syllable = glyphs[start].shaperInfo.syllable;\n while (++start < glyphs.length && glyphs[start].shaperInfo.syllable === syllable);\n return start;\n}\n", "{\"stateTable\":[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,2,3,4,5,6,7,8,9,0,10,11,11,12,13,14,15,16,17],[0,0,0,18,19,20,21,22,23,0,24,0,0,25,26,0,0,27,0],[0,0,0,28,29,30,31,32,33,0,34,0,0,35,36,0,0,37,0],[0,0,0,38,5,7,7,8,9,0,10,0,0,0,13,0,0,16,0],[0,39,0,0,0,40,41,0,9,0,10,0,0,0,42,0,39,0,0],[0,0,0,0,43,44,44,8,9,0,0,0,0,12,43,0,0,0,0],[0,0,0,0,43,44,44,8,9,0,0,0,0,0,43,0,0,0,0],[0,0,0,45,46,47,48,49,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,50,0,0,51,0,10,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,52,0,0,0,0,0,0,0,0],[0,0,0,53,54,55,56,57,58,0,59,0,0,60,61,0,0,62,0],[0,0,0,4,5,7,7,8,9,0,10,0,0,0,13,0,0,16,0],[0,63,64,0,0,40,41,0,9,0,10,0,0,0,42,0,63,0,0],[0,2,3,4,5,6,7,8,9,0,10,11,11,12,13,0,2,16,0],[0,0,0,18,65,20,21,22,23,0,24,0,0,25,26,0,0,27,0],[0,0,0,0,66,67,67,8,9,0,10,0,0,0,68,0,0,0,0],[0,0,0,69,0,70,70,0,71,0,72,0,0,0,0,0,0,0,0],[0,0,0,73,19,74,74,22,23,0,24,0,0,0,26,0,0,27,0],[0,75,0,0,0,76,77,0,23,0,24,0,0,0,78,0,75,0,0],[0,0,0,0,79,80,80,22,23,0,0,0,0,25,79,0,0,0,0],[0,0,0,18,19,20,74,22,23,0,24,0,0,25,26,0,0,27,0],[0,0,0,81,82,83,84,85,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,86,0,0,87,0,24,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,88,0,0,0,0,0,0,0,0],[0,0,0,18,19,74,74,22,23,0,24,0,0,0,26,0,0,27,0],[0,89,90,0,0,76,77,0,23,0,24,0,0,0,78,0,89,0,0],[0,0,0,0,91,92,92,22,23,0,24,0,0,0,93,0,0,0,0],[0,0,0,94,29,95,31,32,33,0,34,0,0,0,36,0,0,37,0],[0,96,0,0,0,97,98,0,33,0,34,0,0,0,99,0,96,0,0],[0,0,0,0,100,101,101,32,33,0,0,0,0,35,100,0,0,0,0],[0,0,0,0,100,101,101,32,33,0,0,0,0,0,100,0,0,0,0],[0,0,0,102,103,104,105,106,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,107,0,0,108,0,34,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,109,0,0,0,0,0,0,0,0],[0,0,0,28,29,95,31,32,33,0,34,0,0,0,36,0,0,37,0],[0,110,111,0,0,97,98,0,33,0,34,0,0,0,99,0,110,0,0],[0,0,0,0,112,113,113,32,33,0,34,0,0,0,114,0,0,0,0],[0,0,0,0,5,7,7,8,9,0,10,0,0,0,13,0,0,16,0],[0,0,0,115,116,117,118,8,9,0,10,0,0,119,120,0,0,16,0],[0,0,0,0,0,121,121,0,9,0,10,0,0,0,42,0,0,0,0],[0,39,0,122,0,123,123,8,9,0,10,0,0,0,42,0,39,0,0],[0,124,64,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,0],[0,39,0,0,0,121,125,0,9,0,10,0,0,0,42,0,39,0,0],[0,0,0,0,0,126,126,8,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,46,47,48,49,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,47,47,49,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,127,127,49,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,128,127,127,49,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,129,130,131,132,133,9,0,10,0,0,0,42,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,50,0,0,0,0,10,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,134,0,0,0,0,0,0,0,0],[0,0,0,135,54,56,56,57,58,0,59,0,0,0,61,0,0,62,0],[0,136,0,0,0,137,138,0,58,0,59,0,0,0,139,0,136,0,0],[0,0,0,0,140,141,141,57,58,0,0,0,0,60,140,0,0,0,0],[0,0,0,0,140,141,141,57,58,0,0,0,0,0,140,0,0,0,0],[0,0,0,142,143,144,145,146,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,147,0,0,148,0,59,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,149,0,0,0,0,0,0,0,0],[0,0,0,53,54,56,56,57,58,0,59,0,0,0,61,0,0,62,0],[0,150,151,0,0,137,138,0,58,0,59,0,0,0,139,0,150,0,0],[0,0,0,0,152,153,153,57,58,0,59,0,0,0,154,0,0,0,0],[0,0,0,155,116,156,157,8,9,0,10,0,0,158,120,0,0,16,0],[0,0,0,0,0,121,121,0,9,0,10,0,0,0,0,0,0,0,0],[0,75,3,4,5,159,160,8,161,0,162,0,11,12,163,0,75,16,0],[0,0,0,0,0,40,164,0,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,165,44,44,8,9,0,0,0,0,0,165,0,0,0,0],[0,124,64,0,0,40,164,0,9,0,10,0,0,0,42,0,124,0,0],[0,0,0,0,0,70,70,0,71,0,72,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,71,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,166,0,0,167,0,72,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,168,0,0,0,0,0,0,0,0],[0,0,0,0,19,74,74,22,23,0,24,0,0,0,26,0,0,27,0],[0,0,0,0,79,80,80,22,23,0,0,0,0,0,79,0,0,0,0],[0,0,0,169,170,171,172,22,23,0,24,0,0,173,174,0,0,27,0],[0,0,0,0,0,175,175,0,23,0,24,0,0,0,78,0,0,0,0],[0,75,0,176,0,177,177,22,23,0,24,0,0,0,78,0,75,0,0],[0,178,90,0,0,0,0,0,0,0,0,0,0,0,0,0,178,0,0],[0,75,0,0,0,175,179,0,23,0,24,0,0,0,78,0,75,0,0],[0,0,0,0,0,180,180,22,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,82,83,84,85,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,83,83,85,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,181,181,85,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,182,181,181,85,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,183,184,185,186,187,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0],[0,0,0,0,0,86,0,0,0,0,24,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,188,0,0,0,0,0,0,0,0],[0,0,0,189,170,190,191,22,23,0,24,0,0,192,174,0,0,27,0],[0,0,0,0,0,175,175,0,23,0,24,0,0,0,0,0,0,0,0],[0,0,0,0,0,76,193,0,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,194,80,80,22,23,0,0,0,0,0,194,0,0,0,0],[0,178,90,0,0,76,193,0,23,0,24,0,0,0,78,0,178,0,0],[0,0,0,0,29,95,31,32,33,0,34,0,0,0,36,0,0,37,0],[0,0,0,0,100,101,101,32,33,0,0,0,0,0,100,0,0,0,0],[0,0,0,195,196,197,198,32,33,0,34,0,0,199,200,0,0,37,0],[0,0,0,0,0,201,201,0,33,0,34,0,0,0,99,0,0,0,0],[0,96,0,202,0,203,203,32,33,0,34,0,0,0,99,0,96,0,0],[0,204,111,0,0,0,0,0,0,0,0,0,0,0,0,0,204,0,0],[0,96,0,0,0,201,205,0,33,0,34,0,0,0,99,0,96,0,0],[0,0,0,0,0,206,206,32,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,103,104,105,106,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,104,104,106,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,207,207,106,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,208,207,207,106,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,209,210,211,212,213,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,34,0,0,0,0,0,0,0,0],[0,0,0,0,0,107,0,0,0,0,34,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,214,0,0,0,0,0,0,0,0],[0,0,0,215,196,216,217,32,33,0,34,0,0,218,200,0,0,37,0],[0,0,0,0,0,201,201,0,33,0,34,0,0,0,0,0,0,0,0],[0,0,0,0,0,97,219,0,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,220,101,101,32,33,0,0,0,0,0,220,0,0,0,0],[0,204,111,0,0,97,219,0,33,0,34,0,0,0,99,0,204,0,0],[0,0,0,221,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0],[0,223,0,0,0,40,224,0,9,0,10,0,0,0,42,0,223,0,0],[0,0,0,0,225,44,44,8,9,0,0,0,0,119,225,0,0,0,0],[0,0,0,115,116,117,222,8,9,0,10,0,0,119,120,0,0,16,0],[0,0,0,115,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0],[0,226,64,0,0,40,224,0,9,0,10,0,0,0,42,0,226,0,0],[0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0],[0,39,0,0,0,121,121,0,9,0,10,0,0,0,42,0,39,0,0],[0,0,0,0,0,44,44,8,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,227,0,228,229,0,9,0,10,0,0,230,0,0,0,0,0],[0,39,0,122,0,121,121,0,9,0,10,0,0,0,42,0,39,0,0],[0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,231,231,49,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,232,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,130,131,132,133,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,131,131,133,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,233,233,133,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,234,233,233,133,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,235,236,237,238,239,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,54,56,56,57,58,0,59,0,0,0,61,0,0,62,0],[0,0,0,240,241,242,243,57,58,0,59,0,0,244,245,0,0,62,0],[0,0,0,0,0,246,246,0,58,0,59,0,0,0,139,0,0,0,0],[0,136,0,247,0,248,248,57,58,0,59,0,0,0,139,0,136,0,0],[0,249,151,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0,0],[0,136,0,0,0,246,250,0,58,0,59,0,0,0,139,0,136,0,0],[0,0,0,0,0,251,251,57,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,143,144,145,146,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,144,144,146,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,252,252,146,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,253,252,252,146,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,254,255,256,257,258,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,59,0,0,0,0,0,0,0,0],[0,0,0,0,0,147,0,0,0,0,59,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,259,0,0,0,0,0,0,0,0],[0,0,0,260,241,261,262,57,58,0,59,0,0,263,245,0,0,62,0],[0,0,0,0,0,246,246,0,58,0,59,0,0,0,0,0,0,0,0],[0,0,0,0,0,137,264,0,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,265,141,141,57,58,0,0,0,0,0,265,0,0,0,0],[0,249,151,0,0,137,264,0,58,0,59,0,0,0,139,0,249,0,0],[0,0,0,221,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0],[0,0,0,0,225,44,44,8,9,0,0,0,0,158,225,0,0,0,0],[0,0,0,155,116,156,222,8,9,0,10,0,0,158,120,0,0,16,0],[0,0,0,155,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0],[0,0,0,0,43,266,266,8,161,0,24,0,0,12,267,0,0,0,0],[0,75,0,176,43,268,268,269,161,0,24,0,0,0,267,0,75,0,0],[0,0,0,0,0,270,0,0,271,0,162,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,272,0,0,0,0,0,0,0,0],[0,273,274,0,0,40,41,0,9,0,10,0,0,0,42,0,273,0,0],[0,0,0,40,0,123,123,8,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,121,275,0,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,72,0,0,0,0,0,0,0,0],[0,0,0,0,0,166,0,0,0,0,72,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,276,0,0,0,0,0,0,0,0],[0,0,0,277,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0],[0,279,0,0,0,76,280,0,23,0,24,0,0,0,78,0,279,0,0],[0,0,0,0,281,80,80,22,23,0,0,0,0,173,281,0,0,0,0],[0,0,0,169,170,171,278,22,23,0,24,0,0,173,174,0,0,27,0],[0,0,0,169,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0],[0,282,90,0,0,76,280,0,23,0,24,0,0,0,78,0,282,0,0],[0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0],[0,75,0,0,0,175,175,0,23,0,24,0,0,0,78,0,75,0,0],[0,0,0,0,0,80,80,22,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,283,0,284,285,0,23,0,24,0,0,286,0,0,0,0,0],[0,75,0,176,0,175,175,0,23,0,24,0,0,0,78,0,75,0,0],[0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,287,287,85,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,288,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,184,185,186,187,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,185,185,187,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,289,289,187,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,290,289,289,187,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,291,292,293,294,295,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,277,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0],[0,0,0,0,281,80,80,22,23,0,0,0,0,192,281,0,0,0,0],[0,0,0,189,170,190,278,22,23,0,24,0,0,192,174,0,0,27,0],[0,0,0,189,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0],[0,0,0,76,0,177,177,22,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,175,296,0,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,297,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0],[0,299,0,0,0,97,300,0,33,0,34,0,0,0,99,0,299,0,0],[0,0,0,0,301,101,101,32,33,0,0,0,0,199,301,0,0,0,0],[0,0,0,195,196,197,298,32,33,0,34,0,0,199,200,0,0,37,0],[0,0,0,195,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0],[0,302,111,0,0,97,300,0,33,0,34,0,0,0,99,0,302,0,0],[0,0,0,0,0,0,0,0,33,0,0,0,0,0,0,0,0,0,0],[0,96,0,0,0,201,201,0,33,0,34,0,0,0,99,0,96,0,0],[0,0,0,0,0,101,101,32,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,303,0,304,305,0,33,0,34,0,0,306,0,0,0,0,0],[0,96,0,202,0,201,201,0,33,0,34,0,0,0,99,0,96,0,0],[0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,307,307,106,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,308,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,210,211,212,213,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,211,211,213,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,309,309,213,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,310,309,309,213,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,311,312,313,314,315,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,297,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0],[0,0,0,0,301,101,101,32,33,0,0,0,0,218,301,0,0,0,0],[0,0,0,215,196,216,298,32,33,0,34,0,0,218,200,0,0,37,0],[0,0,0,215,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0],[0,0,0,97,0,203,203,32,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,201,316,0,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,116,222,222,8,9,0,10,0,0,0,120,0,0,16,0],[0,0,0,0,225,44,44,8,9,0,0,0,0,0,225,0,0,0,0],[0,0,0,317,318,319,320,8,9,0,10,0,0,321,322,0,0,16,0],[0,223,0,323,0,123,123,8,9,0,10,0,0,0,42,0,223,0,0],[0,223,0,0,0,121,324,0,9,0,10,0,0,0,42,0,223,0,0],[0,0,0,325,318,326,327,8,9,0,10,0,0,328,322,0,0,16,0],[0,0,0,64,0,121,121,0,9,0,10,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,9,0,0,0,0,230,0,0,0,0,0],[0,0,0,227,0,228,121,0,9,0,10,0,0,230,0,0,0,0,0],[0,0,0,227,0,121,121,0,9,0,10,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,49,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,0,0],[0,0,0,0,0,329,329,133,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,330,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,236,237,238,239,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,237,237,239,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,331,331,239,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,332,331,331,239,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,333,40,121,334,0,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,335,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0],[0,337,0,0,0,137,338,0,58,0,59,0,0,0,139,0,337,0,0],[0,0,0,0,339,141,141,57,58,0,0,0,0,244,339,0,0,0,0],[0,0,0,240,241,242,336,57,58,0,59,0,0,244,245,0,0,62,0],[0,0,0,240,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0],[0,340,151,0,0,137,338,0,58,0,59,0,0,0,139,0,340,0,0],[0,0,0,0,0,0,0,0,58,0,0,0,0,0,0,0,0,0,0],[0,136,0,0,0,246,246,0,58,0,59,0,0,0,139,0,136,0,0],[0,0,0,0,0,141,141,57,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,341,0,342,343,0,58,0,59,0,0,344,0,0,0,0,0],[0,136,0,247,0,246,246,0,58,0,59,0,0,0,139,0,136,0,0],[0,0,0,0,0,0,0,57,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,345,345,146,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,346,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,255,256,257,258,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,256,256,258,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,347,347,258,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,348,347,347,258,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,349,350,351,352,353,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,335,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0],[0,0,0,0,339,141,141,57,58,0,0,0,0,263,339,0,0,0,0],[0,0,0,260,241,261,336,57,58,0,59,0,0,263,245,0,0,62,0],[0,0,0,260,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0],[0,0,0,137,0,248,248,57,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,246,354,0,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,126,126,8,23,0,0,0,0,0,0,0,0,0,0],[0,355,90,0,0,121,125,0,9,0,10,0,0,0,42,0,355,0,0],[0,0,0,0,0,356,356,269,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,357,358,359,360,361,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,162,0,0,0,0,0,0,0,0],[0,0,0,0,0,270,0,0,0,0,162,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,363,0,0,0,0,0,0,0,0],[0,0,0,364,116,365,366,8,161,0,162,0,0,367,120,0,0,16,0],[0,0,0,0,0,368,368,0,161,0,162,0,0,0,0,0,0,0,0],[0,0,0,40,0,121,121,0,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,170,278,278,22,23,0,24,0,0,0,174,0,0,27,0],[0,0,0,0,281,80,80,22,23,0,0,0,0,0,281,0,0,0,0],[0,0,0,369,370,371,372,22,23,0,24,0,0,373,374,0,0,27,0],[0,279,0,375,0,177,177,22,23,0,24,0,0,0,78,0,279,0,0],[0,279,0,0,0,175,376,0,23,0,24,0,0,0,78,0,279,0,0],[0,0,0,377,370,378,379,22,23,0,24,0,0,380,374,0,0,27,0],[0,0,0,90,0,175,175,0,23,0,24,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,23,0,0,0,0,286,0,0,0,0,0],[0,0,0,283,0,284,175,0,23,0,24,0,0,286,0,0,0,0,0],[0,0,0,283,0,175,175,0,23,0,24,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,85,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,0,0],[0,0,0,0,0,381,381,187,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,382,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,292,293,294,295,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,293,293,295,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,0,383,383,295,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,384,383,383,295,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,385,76,175,386,0,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,76,0,175,175,0,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,196,298,298,32,33,0,34,0,0,0,200,0,0,37,0],[0,0,0,0,301,101,101,32,33,0,0,0,0,0,301,0,0,0,0],[0,0,0,387,388,389,390,32,33,0,34,0,0,391,392,0,0,37,0],[0,299,0,393,0,203,203,32,33,0,34,0,0,0,99,0,299,0,0],[0,299,0,0,0,201,394,0,33,0,34,0,0,0,99,0,299,0,0],[0,0,0,395,388,396,397,32,33,0,34,0,0,398,392,0,0,37,0],[0,0,0,111,0,201,201,0,33,0,34,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,33,0,0,0,0,306,0,0,0,0,0],[0,0,0,303,0,304,201,0,33,0,34,0,0,306,0,0,0,0,0],[0,0,0,303,0,201,201,0,33,0,34,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,106,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,103,0,0],[0,0,0,0,0,399,399,213,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,400,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,312,313,314,315,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,313,313,315,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,0,401,401,315,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,402,401,401,315,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,403,97,201,404,0,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,97,0,201,201,0,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,405,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0],[0,407,0,0,0,40,408,0,9,0,10,0,0,0,42,0,407,0,0],[0,0,0,0,409,44,44,8,9,0,0,0,0,321,409,0,0,0,0],[0,0,0,317,318,319,406,8,9,0,10,0,0,321,322,0,0,16,0],[0,0,0,317,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0],[0,410,64,0,0,40,408,0,9,0,10,0,0,0,42,0,410,0,0],[0,223,0,0,0,121,121,0,9,0,10,0,0,0,42,0,223,0,0],[0,223,0,323,0,121,121,0,9,0,10,0,0,0,42,0,223,0,0],[0,0,0,405,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0],[0,0,0,0,409,44,44,8,9,0,0,0,0,328,409,0,0,0,0],[0,0,0,325,318,326,406,8,9,0,10,0,0,328,322,0,0,16,0],[0,0,0,325,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0],[0,0,0,0,0,0,0,133,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130,0,0],[0,0,0,0,0,411,411,239,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,412,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,40,121,334,0,9,0,10,0,0,0,42,0,0,0,0],[0,0,0,0,413,0,0,0,9,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,241,336,336,57,58,0,59,0,0,0,245,0,0,62,0],[0,0,0,0,339,141,141,57,58,0,0,0,0,0,339,0,0,0,0],[0,0,0,414,415,416,417,57,58,0,59,0,0,418,419,0,0,62,0],[0,337,0,420,0,248,248,57,58,0,59,0,0,0,139,0,337,0,0],[0,337,0,0,0,246,421,0,58,0,59,0,0,0,139,0,337,0,0],[0,0,0,422,415,423,424,57,58,0,59,0,0,425,419,0,0,62,0],[0,0,0,151,0,246,246,0,58,0,59,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,58,0,0,0,0,344,0,0,0,0,0],[0,0,0,341,0,342,246,0,58,0,59,0,0,344,0,0,0,0,0],[0,0,0,341,0,246,246,0,58,0,59,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,146,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,0,0],[0,0,0,0,0,426,426,258,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,427,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,350,351,352,353,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,351,351,353,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,0,428,428,353,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,429,428,428,353,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,430,137,246,431,0,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,137,0,246,246,0,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,432,116,433,434,8,161,0,162,0,0,435,120,0,0,16,0],[0,0,0,0,0,180,180,269,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,358,359,360,361,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,359,359,361,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,436,436,361,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,437,436,436,361,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,438,439,440,441,442,161,0,162,0,0,0,362,0,0,0,0],[0,443,274,0,0,0,0,0,0,0,0,0,0,0,0,0,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,444,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0],[0,0,0,0,225,44,44,8,161,0,0,0,0,367,225,0,0,0,0],[0,0,0,364,116,365,445,8,161,0,162,0,0,367,120,0,0,16,0],[0,0,0,364,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0],[0,0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,446,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0],[0,448,0,0,0,76,449,0,23,0,24,0,0,0,78,0,448,0,0],[0,0,0,0,450,80,80,22,23,0,0,0,0,373,450,0,0,0,0],[0,0,0,369,370,371,447,22,23,0,24,0,0,373,374,0,0,27,0],[0,0,0,369,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0],[0,451,90,0,0,76,449,0,23,0,24,0,0,0,78,0,451,0,0],[0,279,0,0,0,175,175,0,23,0,24,0,0,0,78,0,279,0,0],[0,279,0,375,0,175,175,0,23,0,24,0,0,0,78,0,279,0,0],[0,0,0,446,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0],[0,0,0,0,450,80,80,22,23,0,0,0,0,380,450,0,0,0,0],[0,0,0,377,370,378,447,22,23,0,24,0,0,380,374,0,0,27,0],[0,0,0,377,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0],[0,0,0,0,0,0,0,187,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,0,0],[0,0,0,0,0,452,452,295,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,453,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,76,175,386,0,23,0,24,0,0,0,78,0,0,0,0],[0,0,0,0,454,0,0,0,23,0,0,0,0,0,0,0,0,0,0],[0,0,0,455,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0],[0,457,0,0,0,97,458,0,33,0,34,0,0,0,99,0,457,0,0],[0,0,0,0,459,101,101,32,33,0,0,0,0,391,459,0,0,0,0],[0,0,0,387,388,389,456,32,33,0,34,0,0,391,392,0,0,37,0],[0,0,0,387,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0],[0,460,111,0,0,97,458,0,33,0,34,0,0,0,99,0,460,0,0],[0,299,0,0,0,201,201,0,33,0,34,0,0,0,99,0,299,0,0],[0,299,0,393,0,201,201,0,33,0,34,0,0,0,99,0,299,0,0],[0,0,0,455,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0],[0,0,0,0,459,101,101,32,33,0,0,0,0,398,459,0,0,0,0],[0,0,0,395,388,396,456,32,33,0,34,0,0,398,392,0,0,37,0],[0,0,0,395,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0],[0,0,0,0,0,0,0,213,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,210,0,0],[0,0,0,0,0,461,461,315,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,462,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,97,201,404,0,33,0,34,0,0,0,99,0,0,0,0],[0,0,0,0,463,0,0,0,33,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,318,406,406,8,9,0,10,0,0,0,322,0,0,16,0],[0,0,0,0,409,44,44,8,9,0,0,0,0,0,409,0,0,0,0],[0,0,0,464,465,466,467,8,9,0,10,0,0,468,469,0,0,16,0],[0,407,0,470,0,123,123,8,9,0,10,0,0,0,42,0,407,0,0],[0,407,0,0,0,121,471,0,9,0,10,0,0,0,42,0,407,0,0],[0,0,0,472,465,473,474,8,9,0,10,0,0,475,469,0,0,16,0],[0,0,0,0,0,0,0,239,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,0,0],[0,0,0,0,0,0,476,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,477,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0],[0,479,0,0,0,137,480,0,58,0,59,0,0,0,139,0,479,0,0],[0,0,0,0,481,141,141,57,58,0,0,0,0,418,481,0,0,0,0],[0,0,0,414,415,416,478,57,58,0,59,0,0,418,419,0,0,62,0],[0,0,0,414,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0],[0,482,151,0,0,137,480,0,58,0,59,0,0,0,139,0,482,0,0],[0,337,0,0,0,246,246,0,58,0,59,0,0,0,139,0,337,0,0],[0,337,0,420,0,246,246,0,58,0,59,0,0,0,139,0,337,0,0],[0,0,0,477,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0],[0,0,0,0,481,141,141,57,58,0,0,0,0,425,481,0,0,0,0],[0,0,0,422,415,423,478,57,58,0,59,0,0,425,419,0,0,62,0],[0,0,0,422,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0],[0,0,0,0,0,0,0,258,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0],[0,0,0,0,0,483,483,353,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,484,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,137,246,431,0,58,0,59,0,0,0,139,0,0,0,0],[0,0,0,0,485,0,0,0,58,0,0,0,0,0,0,0,0,0,0],[0,0,0,444,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0],[0,0,0,0,225,44,44,8,161,0,0,0,0,435,225,0,0,0,0],[0,0,0,432,116,433,445,8,161,0,162,0,0,435,120,0,0,16,0],[0,0,0,432,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0],[0,0,0,0,0,486,486,361,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,487,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,439,440,441,442,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,440,440,442,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,488,488,442,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,489,488,488,442,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,490,491,492,493,494,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,495,0,496,497,0,161,0,162,0,0,498,0,0,0,0,0],[0,0,0,0,116,445,445,8,161,0,162,0,0,0,120,0,0,16,0],[0,0,0,0,225,44,44,8,161,0,0,0,0,0,225,0,0,0,0],[0,0,0,0,370,447,447,22,23,0,24,0,0,0,374,0,0,27,0],[0,0,0,0,450,80,80,22,23,0,0,0,0,0,450,0,0,0,0],[0,0,0,499,500,501,502,22,23,0,24,0,0,503,504,0,0,27,0],[0,448,0,505,0,177,177,22,23,0,24,0,0,0,78,0,448,0,0],[0,448,0,0,0,175,506,0,23,0,24,0,0,0,78,0,448,0,0],[0,0,0,507,500,508,509,22,23,0,24,0,0,510,504,0,0,27,0],[0,0,0,0,0,0,0,295,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,292,0,0],[0,0,0,0,0,0,511,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,388,456,456,32,33,0,34,0,0,0,392,0,0,37,0],[0,0,0,0,459,101,101,32,33,0,0,0,0,0,459,0,0,0,0],[0,0,0,512,513,514,515,32,33,0,34,0,0,516,517,0,0,37,0],[0,457,0,518,0,203,203,32,33,0,34,0,0,0,99,0,457,0,0],[0,457,0,0,0,201,519,0,33,0,34,0,0,0,99,0,457,0,0],[0,0,0,520,513,521,522,32,33,0,34,0,0,523,517,0,0,37,0],[0,0,0,0,0,0,0,315,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,312,0,0],[0,0,0,0,0,0,524,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,525,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0],[0,527,0,0,0,40,528,0,9,0,10,0,0,0,42,0,527,0,0],[0,0,0,0,529,44,44,8,9,0,0,0,0,468,529,0,0,0,0],[0,0,0,464,465,466,526,8,9,0,10,0,0,468,469,0,0,16,0],[0,0,0,464,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0],[0,530,64,0,0,40,528,0,9,0,10,0,0,0,42,0,530,0,0],[0,407,0,0,0,121,121,0,9,0,10,0,0,0,42,0,407,0,0],[0,407,0,470,0,121,121,0,9,0,10,0,0,0,42,0,407,0,0],[0,0,0,525,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0],[0,0,0,0,529,44,44,8,9,0,0,0,0,475,529,0,0,0,0],[0,0,0,472,465,473,526,8,9,0,10,0,0,475,469,0,0,16,0],[0,0,0,472,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,0],[0,0,0,0,415,478,478,57,58,0,59,0,0,0,419,0,0,62,0],[0,0,0,0,481,141,141,57,58,0,0,0,0,0,481,0,0,0,0],[0,0,0,531,532,533,534,57,58,0,59,0,0,535,536,0,0,62,0],[0,479,0,537,0,248,248,57,58,0,59,0,0,0,139,0,479,0,0],[0,479,0,0,0,246,538,0,58,0,59,0,0,0,139,0,479,0,0],[0,0,0,539,532,540,541,57,58,0,59,0,0,542,536,0,0,62,0],[0,0,0,0,0,0,0,353,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,350,0,0],[0,0,0,0,0,0,543,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,361,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,358,0,0],[0,0,0,0,0,544,544,442,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,545,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,491,492,493,494,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,492,492,494,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,546,546,494,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,547,546,546,494,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,548,549,368,550,0,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,274,0,368,368,0,161,0,162,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,161,0,0,0,0,498,0,0,0,0,0],[0,0,0,495,0,496,368,0,161,0,162,0,0,498,0,0,0,0,0],[0,0,0,495,0,368,368,0,161,0,162,0,0,0,0,0,0,0,0],[0,0,0,551,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0],[0,553,0,0,0,76,554,0,23,0,24,0,0,0,78,0,553,0,0],[0,0,0,0,555,80,80,22,23,0,0,0,0,503,555,0,0,0,0],[0,0,0,499,500,501,552,22,23,0,24,0,0,503,504,0,0,27,0],[0,0,0,499,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0],[0,556,90,0,0,76,554,0,23,0,24,0,0,0,78,0,556,0,0],[0,448,0,0,0,175,175,0,23,0,24,0,0,0,78,0,448,0,0],[0,448,0,505,0,175,175,0,23,0,24,0,0,0,78,0,448,0,0],[0,0,0,551,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0],[0,0,0,0,555,80,80,22,23,0,0,0,0,510,555,0,0,0,0],[0,0,0,507,500,508,552,22,23,0,24,0,0,510,504,0,0,27,0],[0,0,0,507,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,76,0,0],[0,0,0,557,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0],[0,559,0,0,0,97,560,0,33,0,34,0,0,0,99,0,559,0,0],[0,0,0,0,561,101,101,32,33,0,0,0,0,516,561,0,0,0,0],[0,0,0,512,513,514,558,32,33,0,34,0,0,516,517,0,0,37,0],[0,0,0,512,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0],[0,562,111,0,0,97,560,0,33,0,34,0,0,0,99,0,562,0,0],[0,457,0,0,0,201,201,0,33,0,34,0,0,0,99,0,457,0,0],[0,457,0,518,0,201,201,0,33,0,34,0,0,0,99,0,457,0,0],[0,0,0,557,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0],[0,0,0,0,561,101,101,32,33,0,0,0,0,523,561,0,0,0,0],[0,0,0,520,513,521,558,32,33,0,34,0,0,523,517,0,0,37,0],[0,0,0,520,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,0,0],[0,0,0,0,465,526,526,8,9,0,10,0,0,0,469,0,0,16,0],[0,0,0,0,529,44,44,8,9,0,0,0,0,0,529,0,0,0,0],[0,0,0,563,66,564,565,8,9,0,10,0,0,566,68,0,0,16,0],[0,527,0,567,0,123,123,8,9,0,10,0,0,0,42,0,527,0,0],[0,527,0,0,0,121,568,0,9,0,10,0,0,0,42,0,527,0,0],[0,0,0,569,66,570,571,8,9,0,10,0,0,572,68,0,0,16,0],[0,0,0,573,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0],[0,575,0,0,0,137,576,0,58,0,59,0,0,0,139,0,575,0,0],[0,0,0,0,577,141,141,57,58,0,0,0,0,535,577,0,0,0,0],[0,0,0,531,532,533,574,57,58,0,59,0,0,535,536,0,0,62,0],[0,0,0,531,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0],[0,578,151,0,0,137,576,0,58,0,59,0,0,0,139,0,578,0,0],[0,479,0,0,0,246,246,0,58,0,59,0,0,0,139,0,479,0,0],[0,479,0,537,0,246,246,0,58,0,59,0,0,0,139,0,479,0,0],[0,0,0,573,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0],[0,0,0,0,577,141,141,57,58,0,0,0,0,542,577,0,0,0,0],[0,0,0,539,532,540,574,57,58,0,59,0,0,542,536,0,0,62,0],[0,0,0,539,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,137,0,0],[0,0,0,0,0,0,0,442,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,439,0,0],[0,0,0,0,0,579,579,494,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,580,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,549,368,550,0,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,0,368,368,0,161,0,162,0,0,0,362,0,0,0,0],[0,0,0,0,581,0,0,0,161,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,500,552,552,22,23,0,24,0,0,0,504,0,0,27,0],[0,0,0,0,555,80,80,22,23,0,0,0,0,0,555,0,0,0,0],[0,0,0,582,91,583,584,22,23,0,24,0,0,585,93,0,0,27,0],[0,553,0,586,0,177,177,22,23,0,24,0,0,0,78,0,553,0,0],[0,553,0,0,0,175,587,0,23,0,24,0,0,0,78,0,553,0,0],[0,0,0,588,91,589,590,22,23,0,24,0,0,591,93,0,0,27,0],[0,0,0,0,513,558,558,32,33,0,34,0,0,0,517,0,0,37,0],[0,0,0,0,561,101,101,32,33,0,0,0,0,0,561,0,0,0,0],[0,0,0,592,112,593,594,32,33,0,34,0,0,595,114,0,0,37,0],[0,559,0,596,0,203,203,32,33,0,34,0,0,0,99,0,559,0,0],[0,559,0,0,0,201,597,0,33,0,34,0,0,0,99,0,559,0,0],[0,0,0,598,112,599,600,32,33,0,34,0,0,601,114,0,0,37,0],[0,0,0,602,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0],[0,0,0,0,165,44,44,8,9,0,0,0,0,566,165,0,0,0,0],[0,0,0,563,66,564,67,8,9,0,10,0,0,566,68,0,0,16,0],[0,0,0,563,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0],[0,527,0,0,0,121,121,0,9,0,10,0,0,0,42,0,527,0,0],[0,527,0,567,0,121,121,0,9,0,10,0,0,0,42,0,527,0,0],[0,0,0,602,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0],[0,0,0,0,165,44,44,8,9,0,0,0,0,572,165,0,0,0,0],[0,0,0,569,66,570,67,8,9,0,10,0,0,572,68,0,0,16,0],[0,0,0,569,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0],[0,0,0,0,532,574,574,57,58,0,59,0,0,0,536,0,0,62,0],[0,0,0,0,577,141,141,57,58,0,0,0,0,0,577,0,0,0,0],[0,0,0,603,152,604,605,57,58,0,59,0,0,606,154,0,0,62,0],[0,575,0,607,0,248,248,57,58,0,59,0,0,0,139,0,575,0,0],[0,575,0,0,0,246,608,0,58,0,59,0,0,0,139,0,575,0,0],[0,0,0,609,152,610,611,57,58,0,59,0,0,612,154,0,0,62,0],[0,0,0,0,0,0,0,494,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,491,0,0],[0,0,0,0,0,0,613,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,614,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0],[0,0,0,0,194,80,80,22,23,0,0,0,0,585,194,0,0,0,0],[0,0,0,582,91,583,92,22,23,0,24,0,0,585,93,0,0,27,0],[0,0,0,582,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0],[0,553,0,0,0,175,175,0,23,0,24,0,0,0,78,0,553,0,0],[0,553,0,586,0,175,175,0,23,0,24,0,0,0,78,0,553,0,0],[0,0,0,614,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0],[0,0,0,0,194,80,80,22,23,0,0,0,0,591,194,0,0,0,0],[0,0,0,588,91,589,92,22,23,0,24,0,0,591,93,0,0,27,0],[0,0,0,588,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0],[0,0,0,615,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0],[0,0,0,0,220,101,101,32,33,0,0,0,0,595,220,0,0,0,0],[0,0,0,592,112,593,113,32,33,0,34,0,0,595,114,0,0,37,0],[0,0,0,592,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0],[0,559,0,0,0,201,201,0,33,0,34,0,0,0,99,0,559,0,0],[0,559,0,596,0,201,201,0,33,0,34,0,0,0,99,0,559,0,0],[0,0,0,615,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0],[0,0,0,0,220,101,101,32,33,0,0,0,0,601,220,0,0,0,0],[0,0,0,598,112,599,113,32,33,0,34,0,0,601,114,0,0,37,0],[0,0,0,598,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0],[0,0,0,0,66,67,67,8,9,0,10,0,0,0,68,0,0,16,0],[0,0,0,616,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0],[0,0,0,0,265,141,141,57,58,0,0,0,0,606,265,0,0,0,0],[0,0,0,603,152,604,153,57,58,0,59,0,0,606,154,0,0,62,0],[0,0,0,603,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0],[0,575,0,0,0,246,246,0,58,0,59,0,0,0,139,0,575,0,0],[0,575,0,607,0,246,246,0,58,0,59,0,0,0,139,0,575,0,0],[0,0,0,616,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0],[0,0,0,0,265,141,141,57,58,0,0,0,0,612,265,0,0,0,0],[0,0,0,609,152,610,153,57,58,0,59,0,0,612,154,0,0,62,0],[0,0,0,609,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,549,0,0],[0,0,0,0,91,92,92,22,23,0,24,0,0,0,93,0,0,27,0],[0,0,0,0,112,113,113,32,33,0,34,0,0,0,114,0,0,37,0],[0,0,0,0,152,153,153,57,58,0,59,0,0,0,154,0,0,62,0]],\"accepting\":[false,true,true,true,true,true,false,false,true,true,true,true,true,true,true,true,true,true,true,true,false,true,true,true,true,true,true,true,true,true,false,true,true,true,true,true,true,true,true,true,true,true,false,true,false,true,true,false,false,true,true,true,true,true,true,false,false,true,true,true,true,true,true,true,true,true,true,false,true,true,false,true,true,true,false,true,true,true,false,true,false,true,true,false,false,true,true,true,true,true,true,true,false,true,true,false,true,true,true,false,true,false,true,true,false,false,true,true,true,true,true,true,true,false,true,true,true,false,true,true,true,false,true,false,true,true,false,false,false,true,true,false,false,true,true,true,true,true,true,false,true,false,true,true,false,false,true,true,true,true,true,true,true,false,true,true,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,false,true,true,true,false,true,false,true,true,false,false,false,true,true,false,false,true,true,true,false,true,true,true,true,true,true,false,true,true,true,false,true,false,true,true,false,false,false,true,true,false,false,true,true,true,false,true,true,true,true,true,false,true,true,true,true,true,false,true,true,false,false,false,false,true,true,false,false,true,true,true,false,true,true,true,false,true,false,true,true,false,false,false,true,true,false,false,true,true,true,false,true,true,true,true,false,true,false,true,true,true,true,true,true,true,true,true,false,true,true,true,true,true,false,true,true,false,false,false,false,true,true,false,false,true,true,true,false,true,true,true,true,true,false,true,true,false,false,false,false,true,true,false,false,true,true,true,true,false,true,true,true,true,true,true,false,true,true,false,false,false,false,true,false,true,false,true,true,true,true,true,false,true,true,false,false,false,false,true,true,false,false,true,true,true,false,true,true,false,false,true,false,true,true,false,true,true,false,true,true,false,true,true,true,true,true,true,false,true,true,false,false,false,false,true,false,true,true,false,true,true,true,true,true,true,false,true,true,false,false,false,false,true,false,true,false,true,true,true,true,false,false,false,true,true,false,true,true,true,true,true,true,false,true,true,false,false,false,false,true,false,true,false,true,true,false,false,true,true,false,false,true,true,true,false,true,false,true,true,true,true,false,false,false,true,false,true,true,true,true,false,false,false,true,true,false,true,true,true,true,true,true,false,true,true,false,true,false,true,true,true,true,false,false,false,false,false,false,false,true,true,false,false,true,true,false,true,true,true,true,false,true,true,true,true,true,true,false,true,true,false,true,true,false,true,true,true,true,true,true,false,true,true,false,true,false,true,true,true,true,true,true,false,true,true,true,true,true,true,false,true,true,false,false,false,false,false,true,true,false,true,false,true,true,true,true,true,false,true,true,true,true,true,false,true,true,true,true,true,false,true,true,true,false,true,true,true,true,false,false,false,true,false,true,true,true,true,true,false,true,true,true,false,true,true,true,true,true,false,true,true,true,true,false,true,true,true,true,true,false,true,true,false,true,true,true],\"tags\":[[],[\"broken_cluster\"],[\"consonant_syllable\"],[\"vowel_syllable\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"standalone_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"consonant_syllable\"],[\"broken_cluster\"],[\"symbol_cluster\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"symbol_cluster\"],[],[\"symbol_cluster\"],[\"symbol_cluster\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"symbol_cluster\"],[\"symbol_cluster\"],[\"symbol_cluster\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[\"broken_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"broken_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"broken_cluster\"],[\"symbol_cluster\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[],[],[\"broken_cluster\"],[],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[],[],[\"consonant_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[],[],[\"vowel_syllable\"],[],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[],[],[\"standalone_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[],[],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[],[],[],[],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[],[],[],[\"consonant_syllable\",\"broken_cluster\"],[\"consonant_syllable\",\"broken_cluster\"],[],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[],[],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"consonant_syllable\"],[],[\"consonant_syllable\"],[\"consonant_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"vowel_syllable\"],[],[\"vowel_syllable\"],[\"vowel_syllable\"],[\"broken_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"standalone_cluster\"],[\"standalone_cluster\"],[],[\"consonant_syllable\"],[\"vowel_syllable\"],[\"standalone_cluster\"]]}", "{\"categories\":[\"O\",\"IND\",\"S\",\"GB\",\"B\",\"FM\",\"CGJ\",\"VMAbv\",\"VMPst\",\"VAbv\",\"VPst\",\"CMBlw\",\"VPre\",\"VBlw\",\"H\",\"VMBlw\",\"CMAbv\",\"MBlw\",\"CS\",\"R\",\"SUB\",\"MPst\",\"MPre\",\"FAbv\",\"FPst\",\"FBlw\",\"null\",\"SMAbv\",\"SMBlw\",\"VMPre\",\"ZWNJ\",\"ZWJ\",\"WJ\",\"M\",\"VS\",\"N\",\"HN\",\"MAbv\"],\"decompositions\":{\"2507\":[2503,2494],\"2508\":[2503,2519],\"2888\":[2887,2902],\"2891\":[2887,2878],\"2892\":[2887,2903],\"3018\":[3014,3006],\"3019\":[3015,3006],\"3020\":[3014,3031],\"3144\":[3142,3158],\"3264\":[3263,3285],\"3271\":[3270,3285],\"3272\":[3270,3286],\"3274\":[3270,3266],\"3275\":[3270,3266,3285],\"3402\":[3398,3390],\"3403\":[3399,3390],\"3404\":[3398,3415],\"3546\":[3545,3530],\"3548\":[3545,3535],\"3549\":[3545,3535,3530],\"3550\":[3545,3551],\"3635\":[3661,3634],\"3763\":[3789,3762],\"3955\":[3953,3954],\"3957\":[3953,3956],\"3958\":[4018,3968],\"3959\":[4018,3953,3968],\"3960\":[4019,3968],\"3961\":[4019,3953,3968],\"3969\":[3953,3968],\"6971\":[6970,6965],\"6973\":[6972,6965],\"6976\":[6974,6965],\"6977\":[6975,6965],\"6979\":[6978,6965],\"69934\":[69937,69927],\"69935\":[69938,69927],\"70475\":[70471,70462],\"70476\":[70471,70487],\"70843\":[70841,70842],\"70844\":[70841,70832],\"70846\":[70841,70845],\"71098\":[71096,71087],\"71099\":[71097,71087]},\"stateTable\":[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[2,2,3,4,4,5,0,6,7,8,9,10,11,12,13,14,15,16,0,17,18,11,19,20,21,22,0,0,0,23,0,0,2,0,0,24,0,25],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,28,0,0,0,0,0,27,0,0,0],[0,0,0,0,0,29,0,30,31,32,33,34,35,36,37,38,39,40,0,0,41,35,42,43,44,45,0,0,0,46,0,0,0,0,39,0,0,47],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,0,0,0,0,0,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,8,9,0,0,12,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,0,9,0,0,0,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,8,9,10,11,12,13,14,0,16,0,0,18,11,19,20,21,22,0,0,0,23,0,0,0,0,0,0,0,25],[0,0,0,0,0,5,0,6,7,8,9,0,11,12,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,0,9,0,0,12,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,0,7,0,0,0,0,0,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,8,9,10,11,12,13,14,15,16,0,0,18,11,19,20,21,22,0,0,0,23,0,0,0,0,0,0,0,25],[0,0,0,0,0,5,0,6,7,8,9,0,11,12,0,14,0,0,0,0,0,11,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,4,4,5,0,6,7,8,9,10,11,12,13,14,15,16,0,0,18,11,19,20,21,22,0,0,0,23,0,0,0,0,0,0,0,25],[0,0,0,0,0,5,0,6,7,8,9,48,11,12,13,14,48,16,0,0,18,11,19,20,21,22,0,0,0,23,0,0,0,0,49,0,0,25],[0,0,0,0,0,5,0,6,7,8,9,0,11,12,0,14,0,16,0,0,0,11,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,25],[0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,22,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,0,0,0,0,0,0,14,0,0,0,0,0,0,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,0,51,0],[0,0,0,0,0,5,0,6,7,8,9,0,11,12,0,14,0,16,0,0,0,11,0,20,21,22,0,0,0,23,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,28,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,0,0,0,0,0,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,44,45,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,32,33,0,0,36,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,0,33,0,0,0,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,32,33,34,35,36,37,38,0,40,0,0,41,35,42,43,44,45,0,0,0,46,0,0,0,0,0,0,0,47],[0,0,0,0,0,29,0,30,31,32,33,0,35,36,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,0,33,0,0,36,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,0,31,0,0,0,0,0,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,32,33,34,35,36,37,38,39,40,0,0,41,35,42,43,44,45,0,0,0,46,0,0,0,0,0,0,0,47],[0,0,0,0,0,29,0,30,31,32,33,0,35,36,0,38,0,0,0,0,0,35,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,32,33,52,35,36,37,38,52,40,0,0,41,35,42,43,44,45,0,0,0,46,0,0,0,0,53,0,0,47],[0,0,0,0,0,29,0,30,31,32,33,0,35,36,0,38,0,40,0,0,0,35,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,47],[0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,43,44,45,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,44,45,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,0,0,0,0,0,0,38,0,0,0,0,0,0,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,0,29,0,30,31,32,33,0,35,36,0,38,0,40,0,0,0,35,0,43,44,45,0,0,0,46,0,0,0,0,0,0,0,0],[0,0,0,0,0,5,0,6,7,8,9,48,11,12,13,14,0,16,0,0,18,11,19,20,21,22,0,0,0,23,0,0,0,0,0,0,0,25],[0,0,0,0,0,5,0,6,7,8,9,48,11,12,13,14,48,16,0,0,18,11,19,20,21,22,0,0,0,23,0,0,0,0,0,0,0,25],[0,0,0,0,0,0,0,0,0,0,0,0,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,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,0,0],[0,0,0,0,0,29,0,30,31,32,33,52,35,36,37,38,0,40,0,0,41,35,42,43,44,45,0,0,0,46,0,0,0,0,0,0,0,47],[0,0,0,0,0,29,0,30,31,32,33,52,35,36,37,38,52,40,0,0,41,35,42,43,44,45,0,0,0,46,0,0,0,0,0,0,0,47],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,0,51,0]],\"accepting\":[false,true,true,true,true,true,true,true,true,true,true,true,true,false,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true,true],\"tags\":[[],[\"broken_cluster\"],[\"independent_cluster\"],[\"symbol_cluster\"],[\"standard_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"numeral_cluster\"],[\"broken_cluster\"],[\"independent_cluster\"],[\"symbol_cluster\"],[\"symbol_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"virama_terminated_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"broken_cluster\"],[\"broken_cluster\"],[\"numeral_cluster\"],[\"number_joiner_terminated_cluster\"],[\"standard_cluster\"],[\"standard_cluster\"],[\"numeral_cluster\"]]}", "// Cateories used in the OpenType spec:\n// https://www.microsoft.com/typography/otfntdev/devanot/shaping.aspx\nexport const CATEGORIES = {\n X: 1 << 0,\n C: 1 << 1,\n V: 1 << 2,\n N: 1 << 3,\n H: 1 << 4,\n ZWNJ: 1 << 5,\n ZWJ: 1 << 6,\n M: 1 << 7,\n SM: 1 << 8,\n VD: 1 << 9,\n A: 1 << 10,\n Placeholder: 1 << 11,\n Dotted_Circle: 1 << 12,\n RS: 1 << 13, // Register Shifter, used in Khmer OT spec.\n Coeng: 1 << 14, // Khmer-style Virama.\n Repha: 1 << 15, // Atomically-encoded logical or visual repha.\n Ra: 1 << 16,\n CM: 1 << 17, // Consonant-Medial.\n Symbol: 1 << 18 // Avagraha, etc that take marks (SM,A,VD).\n};\n\n// Visual positions in a syllable from left to right.\nexport const POSITIONS = {\n Start: 1 << 0,\n\n Ra_To_Become_Reph: 1 << 1,\n Pre_M: 1 << 2,\n Pre_C: 1 << 3,\n\n Base_C: 1 << 4,\n After_Main: 1 << 5,\n\n Above_C: 1 << 6,\n\n Before_Sub: 1 << 7,\n Below_C: 1 << 8,\n After_Sub: 1 << 9,\n\n Before_Post: 1 << 10,\n Post_C: 1 << 11,\n After_Post: 1 << 12,\n\n Final_C: 1 << 13,\n SMVD: 1 << 14,\n\n End: 1 << 15\n};\n\nexport const CONSONANT_FLAGS = CATEGORIES.C | CATEGORIES.Ra | CATEGORIES.CM | CATEGORIES.V | CATEGORIES.Placeholder | CATEGORIES.Dotted_Circle;\nexport const JOINER_FLAGS = CATEGORIES.ZWJ | CATEGORIES.ZWNJ;\nexport const HALANT_OR_COENG_FLAGS = CATEGORIES.H | CATEGORIES.Coeng;\n\nexport const INDIC_CONFIGS = {\n Default: {\n hasOldSpec: false,\n virama: 0,\n basePos: 'Last',\n rephPos: POSITIONS.Before_Post,\n rephMode: 'Implicit',\n blwfMode: 'Pre_And_Post'\n },\n\n Devanagari: {\n hasOldSpec: true,\n virama: 0x094D,\n basePos: 'Last',\n rephPos: POSITIONS.Before_Post,\n rephMode: 'Implicit',\n blwfMode: 'Pre_And_Post'\n },\n\n Bengali: {\n hasOldSpec: true,\n virama: 0x09CD,\n basePos: 'Last',\n rephPos: POSITIONS.After_Sub,\n rephMode: 'Implicit',\n blwfMode: 'Pre_And_Post'\n },\n\n Gurmukhi: {\n hasOldSpec: true,\n virama: 0x0A4D,\n basePos: 'Last',\n rephPos: POSITIONS.Before_Sub,\n rephMode: 'Implicit',\n blwfMode: 'Pre_And_Post'\n },\n\n Gujarati: {\n hasOldSpec: true,\n virama: 0x0ACD,\n basePos: 'Last',\n rephPos: POSITIONS.Before_Post,\n rephMode: 'Implicit',\n blwfMode: 'Pre_And_Post'\n },\n\n Oriya: {\n hasOldSpec: true,\n virama: 0x0B4D,\n basePos: 'Last',\n rephPos: POSITIONS.After_Main,\n rephMode: 'Implicit',\n blwfMode: 'Pre_And_Post'\n },\n\n Tamil: {\n hasOldSpec: true,\n virama: 0x0BCD,\n basePos: 'Last',\n rephPos: POSITIONS.After_Post,\n rephMode: 'Implicit',\n blwfMode: 'Pre_And_Post'\n },\n\n Telugu: {\n hasOldSpec: true,\n virama: 0x0C4D,\n basePos: 'Last',\n rephPos: POSITIONS.After_Post,\n rephMode: 'Explicit',\n blwfMode: 'Post_Only'\n },\n\n Kannada: {\n hasOldSpec: true,\n virama: 0x0CCD,\n basePos: 'Last',\n rephPos: POSITIONS.After_Post,\n rephMode: 'Implicit',\n blwfMode: 'Post_Only'\n },\n\n Malayalam: {\n hasOldSpec: true,\n virama: 0x0D4D,\n basePos: 'Last',\n rephPos: POSITIONS.After_Main,\n rephMode: 'Log_Repha',\n blwfMode: 'Pre_And_Post'\n },\n\n // Handled by UniversalShaper\n // Sinhala: {\n // hasOldSpec: false,\n // virama: 0x0DCA,\n // basePos: 'Last_Sinhala',\n // rephPos: POSITIONS.After_Main,\n // rephMode: 'Explicit',\n // blwfMode: 'Pre_And_Post'\n // },\n\n Khmer: {\n hasOldSpec: false,\n virama: 0x17D2,\n basePos: 'First',\n rephPos: POSITIONS.Ra_To_Become_Reph,\n rephMode: 'Vis_Repha',\n blwfMode: 'Pre_And_Post'\n }\n};\n\n// Additional decompositions that aren't in Unicode\nexport const INDIC_DECOMPOSITIONS = {\n // Khmer\n 0x17BE: [0x17C1, 0x17BE],\n 0x17BF: [0x17C1, 0x17BF],\n 0x17C0: [0x17C1, 0x17C0],\n 0x17C4: [0x17C1, 0x17C4],\n 0x17C5: [0x17C1, 0x17C5]\n};\n", "import DefaultShaper from './DefaultShaper';\nimport GlyphInfo from '../GlyphInfo';\n\n/** @typedef {import('../../../types/fontkit').ShapingPlanLike} ShapingPlanLike */\n/** @typedef {import('../../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n/** @typedef {import('../../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../../types/fontkit').FeatureMap} FeatureMap */\n/** @typedef {import('../../../types/fontkit').FeatureInput} FeatureInput */\n/** @typedef {import('../../../types/fontkit').ScriptTag} ScriptTag */\n/** @typedef {import('../../../types/fontkit').OTScriptRecord} OTScriptRecord */\n\n/**\n * Thai / Lao shaper (HarfBuzz hb-ot-shaper-thai.cc):\n * 1. Decompose SARA AM \u2192 NIKHAHIT + SARA AA and reorder NIKHAHIT past above marks\n * 2. PUA tone/vowel shift fallback for legacy fonts without Thai GSUB\n */\nexport default class ThaiShaper extends DefaultShaper {\n /**\n * @param {ShapingPlanLike} plan\n * @param {GlyphInfoLike[]} glyphs\n */\n static assignFeatures(plan, glyphs) {\n super.assignFeatures(plan, glyphs);\n preprocessThai(glyphs, plan.font);\n // HB: PUA only when buffer script is Thai and the font has no Thai GSUB.\n if (isThaiBufferScript(plan.bufferScript || plan.script) && !hasThaiGsub(plan.font)) {\n applyThaiPuaShaping(glyphs, plan.font);\n }\n }\n}\n\n// Thai/Lao SARA AM differ only by the 0x80 bit (U+0E33 / U+0EB3).\n/** @param {number} u @returns {boolean} */\nfunction isSaraAm(u) {\n return (u & ~0x0080) === 0x0E33;\n}\n\n/** @param {number} u @returns {number} */\nfunction nikhahitFromSaraAm(u) {\n return u - 0x0E33 + 0x0E4D;\n}\n\n/** @param {number} u @returns {number} */\nfunction saraAaFromSaraAm(u) {\n return u - 1;\n}\n\n// Above-base marks (Thai; Lao is the same set with +0x80).\n/** @param {number} u @returns {boolean} */\nfunction isAboveBaseMark(u) {\n const c = u & ~0x0080;\n return c === 0x0E31\n || (c >= 0x0E34 && c <= 0x0E37)\n || (c >= 0x0E47 && c <= 0x0E4E)\n || c === 0x0E3B;\n}\n\n/** @param {GlyphInfoLike[]} glyphs @param {LayoutFont} font */\nfunction preprocessThai(glyphs, font) {\n let i = 0;\n while (i < glyphs.length) {\n const u = glyphs[i].codePoints[0];\n if (!isSaraAm(u)) {\n i++;\n continue;\n }\n\n const features = glyphs[i].features;\n const nikhahit = makeGlyph(font, nikhahitFromSaraAm(u), features);\n const saraAa = makeGlyph(font, saraAaFromSaraAm(u), features);\n glyphs.splice(i, 1, nikhahit, saraAa);\n\n // Walk NIKHAHIT backward over above-base marks toward the base.\n let nikhahitIndex = i;\n let target = nikhahitIndex;\n while (target > 0 && isAboveBaseMark(glyphs[target - 1].codePoints[0])) {\n target--;\n }\n if (target !== nikhahitIndex) {\n const moved = glyphs.splice(nikhahitIndex, 1)[0];\n glyphs.splice(target, 0, moved);\n }\n\n i += 2;\n }\n}\n\n/** @param {LayoutFont} font @param {number} codePoint @param {FeatureMap | FeatureInput | null | undefined} features @returns {GlyphInfo} */\nfunction makeGlyph(font, codePoint, features) {\n const g = font.glyphForCodePoint(codePoint);\n // .notdef when the mapped code point is somehow missing from the font.\n return new GlyphInfo(font, g ? g.id : 0, [codePoint], features);\n}\n\n// PUA fallback: above/below state machines remap marks (and some bases) to\n// Windows/Mac private-use codepoints when the font ships those glyphs.\nconst NOP = 0;\nconst SD = 1;\nconst SL = 2;\nconst SDL = 3;\nconst RD = 4;\n\nconst NC = 0; // normal consonant\nconst AC = 1; // ascender (1B/1D/1F)\nconst RC = 2; // removable descender (0D/10)\nconst DC = 3; // strict descender (0E/0F)\nconst NOT_CONSONANT = 4;\n\nconst AV = 0; // above-base vowel/mark\nconst BV = 1; // below-base vowel/mark\nconst T = 2; // tone mark\nconst NOT_MARK = 3;\n\n/** @param {number} u @returns {number} */\nfunction getConsonantType(u) {\n if (u === 0x0E1B || u === 0x0E1D || u === 0x0E1F) return AC;\n if (u === 0x0E0D || u === 0x0E10) return RC;\n if (u === 0x0E0E || u === 0x0E0F) return DC;\n if (u >= 0x0E01 && u <= 0x0E2E) return NC;\n return NOT_CONSONANT;\n}\n\n/** @param {number} u @returns {number} */\nfunction getMarkType(u) {\n if (\n u === 0x0E31\n || (u >= 0x0E34 && u <= 0x0E37)\n || u === 0x0E47\n || (u >= 0x0E4D && u <= 0x0E4E)\n ) {\n return AV;\n }\n if (u >= 0x0E38 && u <= 0x0E3A) return BV;\n if (u >= 0x0E48 && u <= 0x0E4C) return T;\n return NOT_MARK;\n}\n\nconst T0 = 0, T1 = 1, T2 = 2, T3 = 3;\nconst ABOVE_START_STATE = [T0, T1, T0, T0, T3]; // NC AC RC DC NOT_CONSONANT\n/** @type {[number, number][][]} */\nconst ABOVE_STATE_MACHINE = [\n // AV BV T\n [[NOP, T3], [NOP, T0], [SD, T3]], // T0\n [[SL, T2], [NOP, T1], [SDL, T2]], // T1\n [[NOP, T3], [NOP, T2], [SL, T3]], // T2\n [[NOP, T3], [NOP, T3], [NOP, T3]] // T3\n];\n\nconst B0 = 0, B1 = 1, B2 = 2;\nconst BELOW_START_STATE = [B0, B0, B1, B2, B2];\n/** @type {[number, number][][]} */\nconst BELOW_STATE_MACHINE = [\n // AV BV T\n [[NOP, B0], [NOP, B2], [NOP, B0]], // B0\n [[NOP, B1], [RD, B2], [NOP, B1]], // B1\n [[NOP, B2], [SD, B2], [NOP, B2]] // B2\n];\n\n// [original, Windows PUA, Mac PUA] per action\n/** @type {Record<number, number[][]>} */\nconst PUA_MAPPINGS = {\n [SD]: [\n [0x0E48, 0xF70A, 0xF88B], // MAI EK\n [0x0E49, 0xF70B, 0xF88E], // MAI THO\n [0x0E4A, 0xF70C, 0xF891], // MAI TRI\n [0x0E4B, 0xF70D, 0xF894], // MAI CHATTAWA\n [0x0E4C, 0xF70E, 0xF897], // THANTHAKHAT\n [0x0E38, 0xF718, 0xF89B], // SARA U\n [0x0E39, 0xF719, 0xF89C], // SARA UU\n [0x0E3A, 0xF71A, 0xF89D] // PHINTHU\n ],\n [SDL]: [\n [0x0E48, 0xF705, 0xF88C],\n [0x0E49, 0xF706, 0xF88F],\n [0x0E4A, 0xF707, 0xF892],\n [0x0E4B, 0xF708, 0xF895],\n [0x0E4C, 0xF709, 0xF898]\n ],\n [SL]: [\n [0x0E48, 0xF713, 0xF88A],\n [0x0E49, 0xF714, 0xF88D],\n [0x0E4A, 0xF715, 0xF890],\n [0x0E4B, 0xF716, 0xF893],\n [0x0E4C, 0xF717, 0xF896],\n [0x0E31, 0xF710, 0xF884], // MAI HAN-AKAT\n [0x0E34, 0xF701, 0xF885], // SARA I\n [0x0E35, 0xF702, 0xF886], // SARA II\n [0x0E36, 0xF703, 0xF887], // SARA UE\n [0x0E37, 0xF704, 0xF888], // SARA UEE\n [0x0E47, 0xF712, 0xF889], // MAITAIKHU\n [0x0E4D, 0xF711, 0xF899] // NIKHAHIT\n ],\n [RD]: [\n [0x0E0D, 0xF70F, 0xF89A], // YO YING\n [0x0E10, 0xF700, 0xF89E] // THO THAN\n ]\n};\n\n/** @param {number} u @param {number} action @param {LayoutFont} font @returns {number} */\nfunction thaiPuaShape(u, action, font) {\n if (action === NOP) return u;\n const mappings = PUA_MAPPINGS[action];\n if (!mappings) return u;\n for (const [orig, winPua, macPua] of mappings) {\n if (orig !== u) continue;\n if (font.hasGlyphForCodePoint(winPua)) return winPua;\n if (font.hasGlyphForCodePoint(macPua)) return macPua;\n break;\n }\n return u;\n}\n\n/** @param {GlyphInfoLike[]} glyphs @param {number} index @param {number} newCp @param {LayoutFont} font */\nfunction replaceGlyphCodePoint(glyphs, index, newCp, font) {\n const prev = glyphs[index];\n if (prev.codePoints[0] === newCp) return;\n const g = font.glyphForCodePoint(newCp);\n if (!g) return;\n glyphs[index] = new GlyphInfo(font, g.id, [newCp], prev.features);\n}\n\n/** @param {GlyphInfoLike[]} glyphs @param {LayoutFont} font */\nfunction applyThaiPuaShaping(glyphs, font) {\n let aboveState = ABOVE_START_STATE[NOT_CONSONANT];\n let belowState = BELOW_START_STATE[NOT_CONSONANT];\n let baseIndex = 0;\n\n for (let i = 0; i < glyphs.length; i++) {\n const u = glyphs[i].codePoints[0];\n const mt = getMarkType(u);\n\n if (mt === NOT_MARK) {\n const ct = getConsonantType(u);\n aboveState = ABOVE_START_STATE[ct];\n belowState = BELOW_START_STATE[ct];\n baseIndex = i;\n continue;\n }\n\n const [aboveAction, aboveNext] = ABOVE_STATE_MACHINE[aboveState][mt];\n const [belowAction, belowNext] = BELOW_STATE_MACHINE[belowState][mt];\n aboveState = aboveNext;\n belowState = belowNext;\n\n // At most one action is non-NOP.\n const action = aboveAction !== NOP ? aboveAction : belowAction;\n if (action === NOP) continue;\n\n if (action === RD) {\n replaceGlyphCodePoint(glyphs, baseIndex, thaiPuaShape(glyphs[baseIndex].codePoints[0], action, font), font);\n } else {\n replaceGlyphCodePoint(glyphs, i, thaiPuaShape(u, action, font), font);\n }\n }\n}\n\n// Gate PUA shaping on absence of Thai GSUB (HB plan->map.found_script[0]).\n/** @param {LayoutFont} font @returns {boolean} */\nfunction hasThaiGsub(font) {\n const gsub = font.GSUB;\n if (!gsub || !gsub.scriptList) return false;\n return gsub.scriptList.some(/** @param {OTScriptRecord} entry */ entry => entry.tag === 'thai' || entry.tag === 'tha2');\n}\n\n/** @param {ScriptTag | string[] | null | undefined} script @returns {boolean} */\nfunction isThaiBufferScript(script) {\n if (Array.isArray(script)) return script.includes('thai');\n return script === 'thai';\n}\n", "import DefaultShaper from './DefaultShaper';\nimport StateMachine from 'dfa';\nimport UnicodeTrie from '../../packages/unicode-trie/index.js';\nimport GlyphInfo from '../GlyphInfo';\nimport useData from './use.json';\nimport { decodeBase64 } from '../../utils';\nimport useTrie from './use.trie';\n\n/** @typedef {import('../../../types/fontkit').ShapingPlanLike} ShapingPlanLike */\n/** @typedef {import('../../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n/** @typedef {import('../../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../../types/fontkit').USEShaperInfo} USEShaperInfo */\n/** @typedef {import('dfa').StateMachineDefinition} StateMachineDefinition */\n\n/**\n * Generated USE payload: category tables plus a compiled `dfa` machine\n * (`stateTable` / `accepting` / `tags`). Extra keys are fine \u2014 StateMachine\n * only reads the three DFA fields.\n *\n * @typedef {StateMachineDefinition & {\n * categories: string[],\n * decompositions: Record<string, number[]>\n * }} UseData\n */\n\n/** @type {UseData} */\nconst useDataTyped = /** @type {UseData} */ (useData);\nconst { categories, decompositions } = useDataTyped;\nconst trie = new UnicodeTrie(decodeBase64(useTrie));\nconst stateMachine = new StateMachine(useDataTyped);\n\n/**\n * This shaper is an implementation of the Universal Shaping Engine, which\n * uses Unicode data to shape a number of scripts without a dedicated shaping engine.\n * See https://www.microsoft.com/typography/OpenTypeDev/USE/intro.htm.\n */\nexport default class UniversalShaper extends DefaultShaper {\n static zeroMarkWidths = 'BEFORE_GPOS';\n /**\n * @param {ShapingPlanLike} plan\n */\n static planFeatures(plan) {\n plan.addStage(setupSyllables);\n\n // Default glyph pre-processing group\n plan.addStage(['locl', 'ccmp', 'nukt', 'akhn']);\n\n // Reordering group\n plan.addStage(clearSubstitutionFlags);\n plan.addStage(['rphf'], false);\n plan.addStage(recordRphf);\n plan.addStage(clearSubstitutionFlags);\n plan.addStage(['pref']);\n plan.addStage(recordPref);\n\n // Orthographic unit shaping group\n plan.addStage(['rkrf', 'abvf', 'blwf', 'half', 'pstf', 'vatu', 'cjct']);\n plan.addStage(reorder);\n\n // Topographical features\n // Scripts that need this are handled by the Arabic shaper, not implemented here for now.\n // plan.addStage(['isol', 'init', 'medi', 'fina', 'med2', 'fin2', 'fin3'], false);\n\n // Standard topographic presentation and positional feature application\n plan.addStage(['abvs', 'blws', 'pres', 'psts', 'dist', 'abvm', 'blwm']);\n }\n\n /**\n * @param {ShapingPlanLike} plan\n * @param {GlyphInfoLike[]} glyphs\n */\n static assignFeatures(plan, glyphs) {\n // Decompose split vowels\n // TODO: do this in a more general unicode normalizer\n for (let i = glyphs.length - 1; i >= 0; i--) {\n let codepoint = glyphs[i].codePoints[0];\n let decomp = decompositions[String(codepoint)] || decompositions[/** @type {keyof typeof decompositions} */ (/** @type {unknown} */ (codepoint))];\n if (decomp) {\n /** @type {GlyphInfo[]} */\n let decomposed = [];\n for (let c of decomp) {\n let g = plan.font.glyphForCodePoint(c);\n if (g) {\n decomposed.push(new GlyphInfo(plan.font, g.id, [c], glyphs[i].features));\n }\n }\n\n glyphs.splice(i, 1, ...decomposed);\n }\n }\n }\n}\n\n/** @param {GlyphInfoLike} glyph @returns {number} */\nfunction useCategory(glyph) {\n return trie.get(glyph.codePoints[0]);\n}\n\nclass USEInfo {\n /**\n * @param {string} category\n * @param {string} syllableType\n * @param {number} syllable\n */\n constructor(category, syllableType, syllable) {\n this.category = category;\n this.syllableType = syllableType;\n this.syllable = syllable;\n }\n}\n\n/**\n * @param {import('../../../types/fontkit').IndicShaperInfo | import('../../../types/fontkit').USEShaperInfo | null} info\n * @returns {info is USEShaperInfo}\n */\nfunction isUSEShaperInfo(info) {\n return info != null && typeof info.category === 'string';\n}\n\n/**\n * @param {GlyphInfoLike} glyph\n * @returns {USEShaperInfo}\n */\nfunction useInfo(glyph) {\n let info = glyph.shaperInfo;\n if (!isUSEShaperInfo(info)) {\n throw new Error('Expected USE shaperInfo');\n }\n return info;\n}\n\n/** @type {import('../../../types/fontkit').ShapingStageFn} */\nfunction setupSyllables(font, glyphs) {\n let syllable = 0;\n for (let [start, end, tags] of stateMachine.match(glyphs.map(useCategory))) {\n ++syllable;\n\n // Create shaper info\n for (let i = start; i <= end; i++) {\n glyphs[i].shaperInfo = new USEInfo(categories[useCategory(glyphs[i])], tags[0], syllable);\n }\n\n // Assign rphf feature\n let limit = useInfo(glyphs[start]).category === 'R' ? 1 : Math.min(3, end - start);\n for (let i = start; i < start + limit; i++) {\n glyphs[i].features.rphf = true;\n }\n }\n}\n\n/** @type {import('../../../types/fontkit').ShapingStageFn} */\nfunction clearSubstitutionFlags(font, glyphs) {\n for (let glyph of glyphs) {\n glyph.substituted = false;\n }\n}\n\n/** @type {import('../../../types/fontkit').ShapingStageFn} */\nfunction recordRphf(font, glyphs) {\n for (let glyph of glyphs) {\n if (glyph.substituted && glyph.features.rphf) {\n // Mark a substituted repha.\n useInfo(glyph).category = 'R';\n }\n }\n}\n\n/** @type {import('../../../types/fontkit').ShapingStageFn} */\nfunction recordPref(font, glyphs) {\n for (let glyph of glyphs) {\n if (glyph.substituted) {\n // Mark a substituted pref as VPre, as they behave the same way.\n useInfo(glyph).category = 'VPre';\n }\n }\n}\n\n/** @type {import('../../../types/fontkit').ShapingStageFn} */\nfunction reorder(font, glyphs) {\n let dottedCircleGlyph = font.glyphForCodePoint(0x25cc);\n let dottedCircle = dottedCircleGlyph ? dottedCircleGlyph.id : 0;\n\n for (let start = 0, end = nextSyllable(glyphs, 0); start < glyphs.length; start = end, end = nextSyllable(glyphs, start)) {\n let i, j;\n let info = useInfo(glyphs[start]);\n let type = info.syllableType;\n\n // Only a few syllable types need reordering.\n if (type !== 'virama_terminated_cluster' && type !== 'standard_cluster' && type !== 'broken_cluster') {\n continue;\n }\n\n // Insert a dotted circle glyph in broken clusters.\n if (type === 'broken_cluster' && dottedCircle) {\n let g = new GlyphInfo(font, dottedCircle, [0x25cc]);\n g.shaperInfo = info;\n\n // Insert after possible Repha.\n for (i = start; i < end && useInfo(glyphs[i]).category === 'R'; i++);\n glyphs.splice(i + 1, 0, g);\n end++;\n }\n\n // Move things forward.\n if (info.category === 'R' && end - start > 1) {\n // Got a repha. Reorder it to after first base, before first halant.\n for (i = start + 1; i < end; i++) {\n info = useInfo(glyphs[i]);\n if (isBase(info) || isHalant(glyphs[i])) {\n // If we hit a halant, move before it; otherwise it's a base: move to it's\n // place, and shift things in between backward.\n if (isHalant(glyphs[i])) {\n i--;\n }\n\n glyphs.splice(start, 0, ...glyphs.splice(start + 1, i - start), glyphs[i]);\n break;\n }\n }\n }\n\n // Move things back.\n for (i = start, j = end; i < end; i++) {\n info = useInfo(glyphs[i]);\n if (isBase(info) || isHalant(glyphs[i])) {\n // If we hit a halant, move after it; otherwise it's a base: move to it's\n // place, and shift things in between backward.\n j = isHalant(glyphs[i]) ? i + 1 : i;\n } else if ((info.category === 'VPre' || info.category === 'VMPre') && j < i) {\n glyphs.splice(j, 1, glyphs[i], ...glyphs.splice(j, i - j));\n }\n }\n }\n}\n\n/** @param {GlyphInfoLike[]} glyphs @param {number} start @returns {number} */\nfunction nextSyllable(glyphs, start) {\n if (start >= glyphs.length) return start;\n let syllable = useInfo(glyphs[start]).syllable;\n while (++start < glyphs.length && useInfo(glyphs[start]).syllable === syllable);\n return start;\n}\n\n/** @param {GlyphInfoLike} glyph @returns {boolean} */\nfunction isHalant(glyph) {\n return useInfo(glyph).category === 'H' && !glyph.isLigated;\n}\n\n/** @param {USEShaperInfo} info @returns {boolean} */\nfunction isBase(info) {\n return info.category === 'B' || info.category === 'GB';\n}\n", "import DefaultShaper from './DefaultShaper';\nimport ArabicShaper from './ArabicShaper';\nimport HangulShaper from './HangulShaper';\nimport HebrewShaper from './HebrewShaper';\nimport IndicShaper from './IndicShaper';\nimport ThaiShaper from './ThaiShaper';\nimport UniversalShaper from './UniversalShaper';\n\n/** @typedef {typeof DefaultShaper} ShaperClass */\n/** @typedef {import('../../../types/fontkit').ScriptTag} ScriptTag */\n\n/** @type {Record<string, ShaperClass>} */\nconst SHAPERS = {\n arab: ArabicShaper, // Arabic\n mong: ArabicShaper, // Mongolian\n syrc: ArabicShaper, // Syriac\n 'nko ': ArabicShaper, // N'Ko\n phag: ArabicShaper, // Phags Pa\n mand: ArabicShaper, // Mandaic\n mani: ArabicShaper, // Manichaean\n phlp: ArabicShaper, // Psalter Pahlavi\n\n hang: HangulShaper, // Hangul\n\n hebr: HebrewShaper, // Hebrew\n\n bng2: IndicShaper, // Bengali\n beng: IndicShaper, // Bengali\n dev2: IndicShaper, // Devanagari\n deva: IndicShaper, // Devanagari\n gjr2: IndicShaper, // Gujarati\n gujr: IndicShaper, // Gujarati\n guru: IndicShaper, // Gurmukhi\n gur2: IndicShaper, // Gurmukhi\n knda: IndicShaper, // Kannada\n knd2: IndicShaper, // Kannada\n mlm2: IndicShaper, // Malayalam\n mlym: IndicShaper, // Malayalam\n ory2: IndicShaper, // Oriya\n orya: IndicShaper, // Oriya\n taml: IndicShaper, // Tamil\n tml2: IndicShaper, // Tamil\n telu: IndicShaper, // Telugu\n tel2: IndicShaper, // Telugu\n khmr: IndicShaper, // Khmer\n\n thai: ThaiShaper, // Thai\n 'lao ': ThaiShaper, // Lao (4-char OT tag with trailing space)\n\n bali: UniversalShaper, // Balinese\n batk: UniversalShaper, // Batak\n brah: UniversalShaper, // Brahmi\n bugi: UniversalShaper, // Buginese\n buhd: UniversalShaper, // Buhid\n cakm: UniversalShaper, // Chakma\n cham: UniversalShaper, // Cham\n dupl: UniversalShaper, // Duployan\n egyp: UniversalShaper, // Egyptian Hieroglyphs\n gran: UniversalShaper, // Grantha\n hano: UniversalShaper, // Hanunoo\n java: UniversalShaper, // Javanese\n kthi: UniversalShaper, // Kaithi\n kali: UniversalShaper, // Kayah Li\n khar: UniversalShaper, // Kharoshthi\n khoj: UniversalShaper, // Khojki\n sind: UniversalShaper, // Khudawadi\n lepc: UniversalShaper, // Lepcha\n limb: UniversalShaper, // Limbu\n mahj: UniversalShaper, // Mahajani\n // mand: UniversalShaper, // Mandaic\n // mani: UniversalShaper, // Manichaean\n mtei: UniversalShaper, // Meitei Mayek\n modi: UniversalShaper, // Modi\n // mong: UniversalShaper, // Mongolian\n // 'nko ': UniversalShaper, // N\u2019Ko\n hmng: UniversalShaper, // Pahawh Hmong\n // phag: UniversalShaper, // Phags-pa\n // phlp: UniversalShaper, // Psalter Pahlavi\n rjng: UniversalShaper, // Rejang\n saur: UniversalShaper, // Saurashtra\n shrd: UniversalShaper, // Sharada\n sidd: UniversalShaper, // Siddham\n sinh: IndicShaper, // Sinhala\n sund: UniversalShaper, // Sundanese\n sylo: UniversalShaper, // Syloti Nagri\n tglg: UniversalShaper, // Tagalog\n tagb: UniversalShaper, // Tagbanwa\n tale: UniversalShaper, // Tai Le\n lana: UniversalShaper, // Tai Tham\n tavt: UniversalShaper, // Tai Viet\n takr: UniversalShaper, // Takri\n tibt: UniversalShaper, // Tibetan\n tfng: UniversalShaper, // Tifinagh\n tirh: UniversalShaper, // Tirhuta\n\n latn: DefaultShaper, // Latin\n DFLT: DefaultShaper // Default\n};\n\n/**\n * @param {ScriptTag | string[] | null | undefined} script\n * @returns {ShaperClass}\n */\nexport function choose(script) {\n /** @type {Array<string | null | undefined>} */\n let scripts;\n if (!Array.isArray(script)) {\n scripts = [script];\n } else {\n scripts = script;\n }\n\n for (let s of scripts) {\n if (s == null) continue;\n let shaper = SHAPERS[s];\n if (shaper) {\n return shaper;\n }\n }\n\n return DefaultShaper;\n}\n", "import OTProcessor from './OTProcessor';\nimport GlyphInfo from './GlyphInfo';\n\n/** @typedef {import('../../types/fontkit').CoverageTable} CoverageTable */\n/** @typedef {import('../../types/fontkit').OTLookup} OTLookup */\n/** @typedef {import('../../types/fontkit').ExtensionSubtable} ExtensionSubtable */\n/** @typedef {import('restructure').StructValue} StructValue */\n\n/**\n * @typedef {StructValue & {\n * coverage?: CoverageTable,\n * version?: number,\n * deltaGlyphID?: number,\n * substitute?: import('../../types/fontkit').LazyList<number>,\n * sequences?: import('../../types/fontkit').LazyList<number[]>,\n * alternateSet?: import('../../types/fontkit').LazyList<number[]>,\n * ligatureSets?: import('../../types/fontkit').LazyList<Array<{ glyph: number, components: number[] }>>,\n * lookupType?: number,\n * extension?: StructValue,\n * backtrackGlyphCount?: number,\n * backtrackCoverage?: CoverageTable[],\n * lookaheadCoverage?: CoverageTable[],\n * }} GSUBSubtable\n */\n\nexport default class GSUBProcessor extends OTProcessor {\n /**\n * @param {OTLookup} lookup\n * @returns {number}\n */\n lookupDirection(lookup) {\n let first = lookup.subTables[0];\n let type = lookup.lookupType === 7\n ? (first && typeof first === 'object' && 'lookupType' in first\n ? /** @type {number} */ (/** @type {{ lookupType?: number }} */ (first).lookupType)\n : undefined)\n : lookup.lookupType;\n return type === 8 ? -1 : 1;\n }\n\n /**\n * @param {number} lookupType\n * @param {StructValue} table\n * @returns {boolean}\n */\n applyLookup(lookupType, table) {\n let t = /** @type {GSUBSubtable} */ (table);\n let glyphIterator = this.glyphIterator;\n if (!glyphIterator) {\n return false;\n }\n\n switch (lookupType) {\n case 1: { // Single Substitution\n if (!t.coverage) return false;\n let index = this.coverageIndex(t.coverage);\n if (index === -1) {\n return false;\n }\n\n let glyph = glyphIterator.cur;\n if (!glyph) return false;\n\n switch (t.version) {\n case 1:\n glyph.id = (glyph.id + (t.deltaGlyphID ?? 0)) & 0xffff;\n break;\n\n case 2:\n if (t.substitute) glyph.id = t.substitute.get(index);\n break;\n }\n\n return true;\n }\n\n case 2: { // Multiple Substitution\n if (!t.coverage || !t.sequences) return false;\n let index = this.coverageIndex(t.coverage);\n if (index !== -1) {\n let sequence = t.sequences.get(index);\n\n if (sequence.length === 0) {\n // If the sequence length is zero, delete the glyph.\n // The OpenType spec disallows this, but seems like Harfbuzz and Uniscribe allow it.\n this.glyphs.splice(glyphIterator.index, 1);\n return true;\n }\n\n let curGlyph = glyphIterator.cur;\n if (!curGlyph) return false;\n\n curGlyph.id = sequence[0];\n curGlyph.ligatureComponent = 0;\n\n let features = curGlyph.features;\n let replacement = sequence.slice(1).map(/** @param {number} gid @param {number} i */ (gid, i) => {\n let glyph = new GlyphInfo(this.font, gid, undefined, features);\n glyph.shaperInfo = curGlyph.shaperInfo;\n glyph.isLigated = curGlyph.isLigated;\n glyph.ligatureComponent = i + 1;\n glyph.substituted = true;\n glyph.isMultiplied = true;\n return glyph;\n });\n\n this.glyphs.splice(glyphIterator.index + 1, 0, ...replacement);\n return true;\n }\n\n return false;\n }\n\n case 3: { // Alternate Substitution\n if (!t.coverage || !t.alternateSet) return false;\n let index = this.coverageIndex(t.coverage);\n if (index === -1) return false;\n\n // 1-based index from user features (e.g. { aalt: 2 }); boolean / missing \u2192 first\n let alternates = t.alternateSet.get(index);\n let cur = glyphIterator.cur;\n if (!cur) return false;\n\n let alt = this.currentFeature && this.userFeatures ? this.userFeatures[this.currentFeature] : undefined;\n let i = typeof alt === 'number' && Number.isInteger(alt) && alt > 0 ? alt - 1 : 0;\n cur.id = alternates[i < alternates.length ? i : 0];\n return true;\n }\n\n case 4: { // Ligature Substitution\n if (!t.coverage || !t.ligatureSets) return false;\n let index = this.coverageIndex(t.coverage);\n if (index === -1) return false;\n\n for (let ligature of t.ligatureSets.get(index)) {\n let matched = this.sequenceMatchIndices(1, ligature.components);\n if (!matched) continue;\n\n let curGlyph = glyphIterator.cur;\n if (!curGlyph) continue;\n\n // Concatenate all of the characters the new ligature will represent\n let characters = curGlyph.codePoints.slice();\n for (let matchIdx of matched) {\n characters.push(...this.glyphs[matchIdx].codePoints);\n }\n\n // Create the replacement ligature glyph\n let ligatureGlyph = new GlyphInfo(this.font, ligature.glyph, characters, curGlyph.features);\n ligatureGlyph.shaperInfo = curGlyph.shaperInfo;\n ligatureGlyph.isLigated = true;\n ligatureGlyph.substituted = true;\n\n // From Harfbuzz:\n // - If it *is* a mark ligature, we don't allocate a new ligature id, and leave\n // the ligature to keep its old ligature id. This will allow it to attach to\n // a base ligature in GPOS. Eg. if the sequence is: LAM,LAM,SHADDA,FATHA,HEH,\n // and LAM,LAM,HEH for a ligature, they will leave SHADDA and FATHA with a\n // ligature id and component value of 2. Then if SHADDA,FATHA form a ligature\n // later, we don't want them to lose their ligature id/component, otherwise\n // GPOS will fail to correctly position the mark ligature on top of the\n // LAM,LAM,HEH ligature. See https://bugzilla.gnome.org/show_bug.cgi?id=676343\n //\n // - If a ligature is formed of components that some of which are also ligatures\n // themselves, and those ligature components had marks attached to *their*\n // components, we have to attach the marks to the new ligature component\n // positions! Now *that*'s tricky! And these marks may be following the\n // last component of the whole sequence, so we should loop forward looking\n // for them and update them.\n //\n // Eg. the sequence is LAM,LAM,SHADDA,FATHA,HEH, and the font first forms a\n // 'calt' ligature of LAM,HEH, leaving the SHADDA and FATHA with a ligature\n // id and component == 1. Now, during 'liga', the LAM and the LAM-HEH ligature\n // form a LAM-LAM-HEH ligature. We need to reassign the SHADDA and FATHA to\n // the new ligature with a component value of 2.\n //\n // This in fact happened to a font... See https://bugzilla.gnome.org/show_bug.cgi?id=437633\n let isMarkLigature = curGlyph.isMark;\n for (let i = 0; i < matched.length && isMarkLigature; i++) {\n isMarkLigature = this.glyphs[matched[i]].isMark;\n }\n\n ligatureGlyph.ligatureID = isMarkLigature ? null : this.ligatureID++;\n\n let lastLigID = curGlyph.ligatureID;\n let lastNumComps = curGlyph.codePoints.length;\n let curComps = lastNumComps;\n let idx = glyphIterator.index + 1;\n\n // Set ligatureID and ligatureComponent on glyphs that were skipped in the matched sequence.\n // This allows GPOS to attach marks to the correct ligature components.\n for (let matchIndex of matched) {\n // Don't assign new ligature components for mark ligatures (see above)\n if (isMarkLigature) {\n idx = matchIndex;\n } else {\n while (idx < matchIndex) {\n let ligatureComponent = curComps - lastNumComps + Math.min(this.glyphs[idx].ligatureComponent || 1, lastNumComps);\n this.glyphs[idx].ligatureID = ligatureGlyph.ligatureID;\n this.glyphs[idx].ligatureComponent = ligatureComponent;\n idx++;\n }\n }\n\n lastLigID = this.glyphs[idx].ligatureID;\n lastNumComps = this.glyphs[idx].codePoints.length;\n curComps += lastNumComps;\n idx++; // skip base glyph\n }\n\n // Adjust ligature components for any marks following\n if (lastLigID && !isMarkLigature) {\n for (let i = idx; i < this.glyphs.length; i++) {\n if (this.glyphs[i].ligatureID === lastLigID) {\n let ligatureComponent = curComps - lastNumComps + Math.min(this.glyphs[i].ligatureComponent || 1, lastNumComps);\n this.glyphs[i].ligatureComponent = ligatureComponent;\n } else {\n break;\n }\n }\n }\n\n // Delete the matched glyphs, and replace the current glyph with the ligature glyph\n for (let i = matched.length - 1; i >= 0; i--) {\n this.glyphs.splice(matched[i], 1);\n }\n\n this.glyphs[glyphIterator.index] = ligatureGlyph;\n return true;\n }\n\n return false;\n }\n\n case 5: // Contextual Substitution\n return this.applyContext(table);\n\n case 6: // Chaining Contextual Substitution\n return this.applyChainingContext(table);\n\n case 7: { // Extension Substitution\n let ext = /** @type {ExtensionSubtable} */ (table);\n return this.applyLookup(ext.lookupType, ext.extension);\n }\n\n case 8: { // Reverse Chaining Contextual Single Substitution\n if (!t.coverage || !t.substitute || !t.backtrackCoverage || !t.lookaheadCoverage) return false;\n let index = this.coverageIndex(t.coverage);\n if (index === -1) return false;\n\n // Backtrack is stored closest-first; coverageSequenceMatches walks furthest-first.\n if (!this.coverageSequenceMatches(-(t.backtrackGlyphCount ?? t.backtrackCoverage.length), [...t.backtrackCoverage].reverse())\n || !this.coverageSequenceMatches(1, t.lookaheadCoverage)) {\n return false;\n }\n\n let cur = glyphIterator.cur;\n if (!cur) return false;\n cur.id = t.substitute.get(index);\n return true;\n }\n\n default:\n throw new Error(`GSUB lookupType ${lookupType} is not supported`);\n }\n }\n}\n", "import OTProcessor from './OTProcessor';\n\n/** @typedef {import('../../types/fontkit').PositionValue} PositionValue */\n/** @typedef {import('../../types/fontkit').AnchorPoint} AnchorPoint */\n/** @typedef {import('../../types/fontkit').MarkRecord} MarkRecord */\n/** @typedef {import('../../types/fontkit').CoverageTable} CoverageTable */\n/** @typedef {import('../../types/fontkit').ClassDefTable} ClassDefTable */\n/** @typedef {import('../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n/** @typedef {import('../../types/fontkit').GlyphPositionLike} GlyphPositionLike */\n/** @typedef {import('../../types/fontkit').ExtensionSubtable} ExtensionSubtable */\n/** @typedef {import('restructure').StructValue} StructValue */\n\n/**\n * @typedef {StructValue & {\n * coverage?: CoverageTable,\n * version?: number,\n * value?: PositionValue,\n * values?: import('../../types/fontkit').LazyList<PositionValue>,\n * pairSets?: import('../../types/fontkit').LazyList<Array<{ secondGlyph: number, value1: PositionValue, value2: PositionValue }>>,\n * classDef1?: ClassDefTable,\n * classDef2?: ClassDefTable,\n * classRecords?: import('../../types/fontkit').LazyList<import('../../types/fontkit').LazyList<{ value1: PositionValue, value2: PositionValue }>>,\n * entryExitRecords?: Array<{ entryAnchor?: AnchorPoint | null, exitAnchor?: AnchorPoint | null }>,\n * markCoverage?: CoverageTable,\n * baseCoverage?: CoverageTable,\n * markArray?: MarkRecord[],\n * baseArray?: AnchorPoint[][],\n * ligatureCoverage?: CoverageTable,\n * ligatureArray?: AnchorPoint[][][],\n * mark1Coverage?: CoverageTable,\n * mark2Coverage?: CoverageTable,\n * mark1Array?: MarkRecord[],\n * mark2Array?: AnchorPoint[][],\n * lookupType?: number,\n * extension?: StructValue,\n * }} GPOSSubtable\n */\n\nexport default class GPOSProcessor extends OTProcessor {\n /**\n * @param {number} sequenceIndex\n * @param {PositionValue} value\n */\n applyPositionValue(sequenceIndex, value) {\n let glyphIterator = this.glyphIterator;\n if (!glyphIterator || !this.positions) {\n return;\n }\n\n let position = this.positions[glyphIterator.peekIndex(sequenceIndex)];\n if (!position) {\n return;\n }\n\n if (value.xAdvance != null) position.xAdvance += value.xAdvance;\n if (value.yAdvance != null) position.yAdvance += value.yAdvance;\n if (value.xPlacement != null) position.xOffset += value.xPlacement;\n if (value.yPlacement != null) position.yOffset += value.yPlacement;\n\n // Adjustments for font variations\n let variationProcessor = this.font._variationProcessor;\n let variationStore = this.font.GDEF && this.font.GDEF.itemVariationStore;\n if (variationProcessor && variationStore) {\n if (value.xPlaDevice) {\n position.xOffset += variationProcessor.getDelta(variationStore, value.xPlaDevice.a, value.xPlaDevice.b);\n }\n\n if (value.yPlaDevice) {\n position.yOffset += variationProcessor.getDelta(variationStore, value.yPlaDevice.a, value.yPlaDevice.b);\n }\n\n if (value.xAdvDevice) {\n position.xAdvance += variationProcessor.getDelta(variationStore, value.xAdvDevice.a, value.xAdvDevice.b);\n }\n\n if (value.yAdvDevice) {\n position.yAdvance += variationProcessor.getDelta(variationStore, value.yAdvDevice.a, value.yAdvDevice.b);\n }\n }\n\n // TODO: device tables\n }\n\n /**\n * @param {number} lookupType\n * @param {StructValue} table\n * @returns {boolean}\n */\n applyLookup(lookupType, table) {\n let t = /** @type {GPOSSubtable} */ (table);\n let glyphIterator = this.glyphIterator;\n if (!glyphIterator) {\n return false;\n }\n\n switch (lookupType) {\n case 1: { // Single positioning value\n if (!t.coverage) return false;\n let index = this.coverageIndex(t.coverage);\n if (index === -1) return false;\n\n switch (t.version) {\n case 1:\n if (t.value) this.applyPositionValue(0, t.value);\n break;\n\n case 2:\n if (t.values) this.applyPositionValue(0, t.values.get(index));\n break;\n }\n\n return true;\n }\n\n case 2: { // Pair Adjustment Positioning\n let nextGlyph = glyphIterator.peek();\n if (!nextGlyph) return false;\n\n if (!t.coverage) return false;\n let index = this.coverageIndex(t.coverage);\n if (index === -1) return false;\n\n switch (t.version) {\n case 1: { // Adjustments for glyph pairs\n if (!t.pairSets) return false;\n let set = t.pairSets.get(index);\n\n for (let pair of set) {\n if (pair.secondGlyph === nextGlyph.id) {\n this.applyPositionValue(0, pair.value1);\n this.applyPositionValue(1, pair.value2);\n return true;\n }\n }\n\n return false;\n }\n\n case 2: { // Class pair adjustment\n let cur = glyphIterator.cur;\n if (!cur || !t.classDef1 || !t.classDef2 || !t.classRecords) return false;\n\n let class1 = this.getClassID(cur.id, t.classDef1);\n let class2 = this.getClassID(nextGlyph.id, t.classDef2);\n if (class1 === -1 || class2 === -1) return false;\n\n let pair = t.classRecords.get(class1).get(class2);\n this.applyPositionValue(0, pair.value1);\n this.applyPositionValue(1, pair.value2);\n return true;\n }\n }\n\n return false;\n }\n\n case 3: { // Cursive Attachment Positioning\n if (!t.coverage || !t.entryExitRecords || !this.positions) return false;\n\n let nextIndex = glyphIterator.peekIndex();\n let nextGlyph = this.glyphs[nextIndex];\n if (!nextGlyph) return false;\n\n let curRecord = t.entryExitRecords[this.coverageIndex(t.coverage)];\n if (!curRecord || !curRecord.exitAnchor) return false;\n\n let nextRecord = t.entryExitRecords[this.coverageIndex(t.coverage, nextGlyph.id)];\n if (!nextRecord || !nextRecord.entryAnchor) return false;\n\n let entry = this.getAnchor(nextRecord.entryAnchor);\n let exit = this.getAnchor(curRecord.exitAnchor);\n\n let cur = this.positions[glyphIterator.index];\n let next = this.positions[nextIndex];\n if (!cur || !next) return false;\n let d;\n\n switch (this.direction) {\n case 'ltr':\n cur.xAdvance = exit.x + cur.xOffset;\n\n d = entry.x + next.xOffset;\n next.xAdvance -= d;\n next.xOffset -= d;\n break;\n\n case 'rtl':\n d = exit.x + cur.xOffset;\n cur.xAdvance -= d;\n cur.xOffset -= d;\n next.xAdvance = entry.x + next.xOffset;\n break;\n }\n\n let curGlyph = glyphIterator.cur;\n if (!curGlyph) return false;\n\n if (glyphIterator.flags.rightToLeft) {\n curGlyph.cursiveAttachment = nextIndex;\n cur.yOffset = entry.y - exit.y;\n } else {\n nextGlyph.cursiveAttachment = glyphIterator.index;\n cur.yOffset = exit.y - entry.y;\n }\n\n return true;\n }\n\n case 4: { // Mark to base positioning\n if (!t.markCoverage || !t.baseCoverage || !t.markArray || !t.baseArray) return false;\n\n let markIndex = this.coverageIndex(t.markCoverage);\n if (markIndex === -1) return false;\n\n // search backward for a base glyph\n let baseGlyphIndex = glyphIterator.index;\n while (--baseGlyphIndex >= 0 && (this.glyphs[baseGlyphIndex].isMark || (this.glyphs[baseGlyphIndex].ligatureComponent ?? 0) > 0));\n\n if (baseGlyphIndex < 0) return false;\n\n let baseIndex = this.coverageIndex(t.baseCoverage, this.glyphs[baseGlyphIndex].id);\n if (baseIndex === -1) return false;\n\n let markRecord = t.markArray[markIndex];\n let baseAnchor = t.baseArray[baseIndex][markRecord.class];\n return this.applyAnchor(markRecord, baseAnchor, baseGlyphIndex);\n }\n\n case 5: { // Mark to ligature positioning\n if (!t.markCoverage || !t.ligatureCoverage || !t.markArray || !t.ligatureArray) return false;\n\n let markIndex = this.coverageIndex(t.markCoverage);\n if (markIndex === -1) return false;\n\n // search backward for a base glyph\n let baseGlyphIndex = glyphIterator.index;\n while (--baseGlyphIndex >= 0 && this.glyphs[baseGlyphIndex].isMark);\n\n if (baseGlyphIndex < 0) return false;\n\n let ligIndex = this.coverageIndex(t.ligatureCoverage, this.glyphs[baseGlyphIndex].id);\n if (ligIndex === -1) return false;\n\n let ligAttach = t.ligatureArray[ligIndex];\n let markGlyph = glyphIterator.cur;\n let ligGlyph = this.glyphs[baseGlyphIndex];\n if (!markGlyph) return false;\n\n let compIndex = ligGlyph.ligatureID && ligGlyph.ligatureID === markGlyph.ligatureID && (markGlyph.ligatureComponent ?? 0) > 0\n ? Math.min(markGlyph.ligatureComponent ?? 0, ligGlyph.codePoints.length) - 1\n : ligGlyph.codePoints.length - 1;\n\n let markRecord = t.markArray[markIndex];\n let baseAnchor = ligAttach[compIndex][markRecord.class];\n return this.applyAnchor(markRecord, baseAnchor, baseGlyphIndex);\n }\n\n case 6: { // Mark to mark positioning\n if (!t.mark1Coverage || !t.mark2Coverage || !t.mark1Array || !t.mark2Array) return false;\n\n let mark1Index = this.coverageIndex(t.mark1Coverage);\n if (mark1Index === -1) return false;\n\n // get the previous mark to attach to\n let prevIndex = glyphIterator.peekIndex(-1);\n let prev = this.glyphs[prevIndex];\n if (!prev || !prev.isMark) return false;\n\n let cur = glyphIterator.cur;\n if (!cur) return false;\n\n // The following logic was borrowed from Harfbuzz\n let good = false;\n if (cur.ligatureID === prev.ligatureID) {\n if (!cur.ligatureID) { // Marks belonging to the same base\n good = true;\n } else if (cur.ligatureComponent === prev.ligatureComponent) { // Marks belonging to the same ligature component\n good = true;\n }\n } else {\n // If ligature ids don't match, it may be the case that one of the marks\n // itself is a ligature, in which case match.\n if ((cur.ligatureID && !cur.ligatureComponent) || (prev.ligatureID && !prev.ligatureComponent)) {\n good = true;\n }\n }\n\n if (!good) return false;\n\n let mark2Index = this.coverageIndex(t.mark2Coverage, prev.id);\n if (mark2Index === -1) return false;\n\n let markRecord = t.mark1Array[mark1Index];\n let baseAnchor = t.mark2Array[mark2Index][markRecord.class];\n return this.applyAnchor(markRecord, baseAnchor, prevIndex);\n }\n\n case 7: // Contextual positioning\n return this.applyContext(table);\n\n case 8: // Chaining contextual positioning\n return this.applyChainingContext(table);\n\n case 9: { // Extension positioning\n let ext = /** @type {ExtensionSubtable} */ (table);\n return this.applyLookup(ext.lookupType, ext.extension);\n }\n\n default:\n throw new Error(`Unsupported GPOS table: ${lookupType}`);\n }\n }\n\n /**\n * @param {MarkRecord} markRecord\n * @param {AnchorPoint | null | undefined} baseAnchor\n * @param {number} baseGlyphIndex\n * @returns {boolean}\n */\n applyAnchor(markRecord, baseAnchor, baseGlyphIndex) {\n // NULL offset = no anchor for this class; false so later subtables can try (HarfBuzz).\n if (!baseAnchor || !markRecord.markAnchor) return false;\n\n let glyphIterator = this.glyphIterator;\n if (!glyphIterator || !this.positions) return false;\n\n let baseCoords = this.getAnchor(baseAnchor);\n let markCoords = this.getAnchor(markRecord.markAnchor);\n let markPos = this.positions[glyphIterator.index];\n if (!markPos) return false;\n\n markPos.xOffset = baseCoords.x - markCoords.x;\n markPos.yOffset = baseCoords.y - markCoords.y;\n let cur = glyphIterator.cur;\n if (!cur) return false;\n cur.markAttachment = baseGlyphIndex;\n return true;\n }\n\n /**\n * @param {AnchorPoint} anchor\n * @returns {{ x: number, y: number }}\n */\n getAnchor(anchor) {\n // TODO: contour point, device tables\n let x = anchor.xCoordinate;\n let y = anchor.yCoordinate;\n\n // Adjustments for font variations\n let variationProcessor = this.font._variationProcessor;\n let variationStore = this.font.GDEF && this.font.GDEF.itemVariationStore;\n if (variationProcessor && variationStore) {\n if (anchor.xDeviceTable) {\n x += variationProcessor.getDelta(variationStore, anchor.xDeviceTable.a, anchor.xDeviceTable.b);\n }\n\n if (anchor.yDeviceTable) {\n y += variationProcessor.getDelta(variationStore, anchor.yDeviceTable.a, anchor.yDeviceTable.b);\n }\n }\n\n return { x, y };\n }\n\n /**\n * @param {string[]} userFeatures\n * @param {GlyphInfoLike[]} glyphs\n * @param {GlyphPositionLike[] | null | undefined} [advances]\n */\n applyFeatures(userFeatures, glyphs, advances) {\n super.applyFeatures(userFeatures, glyphs, advances);\n\n for (let i = 0; i < this.glyphs.length; i++) {\n this.fixCursiveAttachment(i);\n }\n\n this.fixMarkAttachment();\n }\n\n /**\n * @param {number} i\n */\n fixCursiveAttachment(i) {\n let glyph = this.glyphs[i];\n if (glyph.cursiveAttachment != null && this.positions) {\n let j = glyph.cursiveAttachment;\n\n glyph.cursiveAttachment = null;\n this.fixCursiveAttachment(j);\n\n this.positions[i].yOffset += this.positions[j].yOffset;\n }\n }\n\n fixMarkAttachment() {\n if (!this.positions) {\n return;\n }\n\n for (let i = 0; i < this.glyphs.length; i++) {\n let glyph = this.glyphs[i];\n if (glyph.markAttachment != null) {\n let j = glyph.markAttachment;\n\n this.positions[i].xOffset += this.positions[j].xOffset;\n this.positions[i].yOffset += this.positions[j].yOffset;\n\n if (this.direction === 'ltr') {\n for (let k = j; k < i; k++) {\n this.positions[i].xOffset -= this.positions[k].xAdvance;\n this.positions[i].yOffset -= this.positions[k].yAdvance;\n }\n } else {\n for (let k = j + 1; k < i + 1; k++) {\n this.positions[i].xOffset += this.positions[k].xAdvance;\n this.positions[i].yOffset += this.positions[k].yAdvance;\n }\n }\n }\n }\n }\n}\n", "import ShapingPlan from './ShapingPlan';\nimport * as Shapers from './shapers';\nimport GlyphInfo from './GlyphInfo';\nimport GSUBProcessor from './GSUBProcessor';\nimport GPOSProcessor from './GPOSProcessor';\n\n/** @typedef {import('../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../types/fontkit').GlyphRunLike} GlyphRunLike */\n/** @typedef {import('../../types/fontkit').GlyphInfoLike} GlyphInfoLike */\n/** @typedef {import('../../types/fontkit').GlyphPositionLike} GlyphPositionLike */\n/** @typedef {import('../../types/fontkit').FeatureMap} FeatureMap */\n/** @typedef {import('../../types/fontkit').ScriptTag} ScriptTag */\n/** @typedef {import('../../types/fontkit').LanguageTag} LanguageTag */\n/** @typedef {import('../../types/fontkit').LayoutGlyph} LayoutGlyph */\n/** @typedef {import('../../types/fontkit').ShaperLike} ShaperLike */\n\nexport default class OTLayoutEngine {\n /**\n * @param {LayoutFont} font\n */\n constructor(font) {\n /** @type {LayoutFont} */\n this.font = font;\n /** @type {GlyphInfo[] | null} */\n this.glyphInfos = null;\n /** @type {ShapingPlan | null} */\n this.plan = null;\n /** @type {GSUBProcessor | null} */\n this.GSUBProcessor = null;\n /** @type {GPOSProcessor | null} */\n this.GPOSProcessor = null;\n /** @type {boolean} */\n this.fallbackPosition = true;\n /** @type {ShaperLike | null} */\n this.shaper = null;\n\n if (font.GSUB) {\n this.GSUBProcessor = new GSUBProcessor(font, font.GSUB);\n }\n\n if (font.GPOS) {\n this.GPOSProcessor = new GPOSProcessor(font, font.GPOS);\n }\n }\n\n /**\n * @param {GlyphRunLike} glyphRun\n */\n setup(glyphRun) {\n // Map glyphs to GlyphInfo objects so data can be passed between\n // GSUB and GPOS without mutating the real (shared) Glyph objects.\n this.glyphInfos = /** @type {LayoutGlyph[]} */ (glyphRun.glyphs).map(\n /** @param {LayoutGlyph} glyph */ glyph => new GlyphInfo(this.font, glyph.id, [...glyph.codePoints])\n );\n\n // Select an OpenType script for GSUB/GPOS features.\n /** @type {string | null} */\n let script = null;\n if (this.GPOSProcessor) {\n script = this.GPOSProcessor.selectScript(glyphRun.script, glyphRun.language, glyphRun.direction);\n }\n\n if (this.GSUBProcessor) {\n script = this.GSUBProcessor.selectScript(glyphRun.script, glyphRun.language, glyphRun.direction);\n }\n\n // Choose the complex shaper from the buffer Unicode script (HB model). The OT\n // script may fall back to DFLT/latn even for Thai text; that must not select\n // DefaultShaper or Thai SARA AM / PUA preprocessing is skipped.\n this.shaper = /** @type {ShaperLike} */ (Shapers.choose(glyphRun.script || script));\n this.plan = new ShapingPlan(this.font, script || glyphRun.script, glyphRun.direction);\n this.plan.bufferScript = glyphRun.script;\n this.shaper.plan(this.plan, this.glyphInfos, glyphRun.features);\n\n // Enabled features as true, then overlay user values (e.g. aalt: 2) without mutating input.\n /** @type {FeatureMap} */\n let features = {};\n for (let key in this.plan.allFeatures) {\n features[key] = true;\n }\n glyphRun.features = Object.assign(features, glyphRun.features);\n }\n\n /**\n * @param {GlyphRunLike} glyphRun\n */\n substitute(glyphRun) {\n if (this.GSUBProcessor && this.plan && this.glyphInfos) {\n this.plan.process(this.GSUBProcessor, this.glyphInfos);\n\n // Map glyph infos back to normal Glyph objects\n /** @type {LayoutGlyph[]} */\n let glyphs = [];\n for (let glyphInfo of this.glyphInfos) {\n let g = this.font.getGlyph(glyphInfo.id, glyphInfo.codePoints);\n if (g) {\n glyphs.push(g);\n }\n }\n glyphRun.glyphs = glyphs;\n }\n }\n\n /**\n * @param {GlyphRunLike} glyphRun\n * @returns {FeatureMap | Record<string, import('../../types/fontkit').OTFeature> | null | undefined | false}\n */\n position(glyphRun) {\n if (this.shaper && this.shaper.zeroMarkWidths === 'BEFORE_GPOS' && glyphRun.positions) {\n this.zeroMarkAdvances(glyphRun.positions);\n }\n\n if (this.GPOSProcessor && this.plan && this.glyphInfos && glyphRun.positions) {\n this.plan.process(this.GPOSProcessor, this.glyphInfos, glyphRun.positions);\n }\n\n if (this.shaper && this.shaper.zeroMarkWidths === 'AFTER_GPOS' && glyphRun.positions) {\n this.zeroMarkAdvances(glyphRun.positions);\n }\n\n // Reverse the glyphs and positions if the script is right-to-left\n if (glyphRun.direction === 'rtl') {\n glyphRun.glyphs.reverse();\n if (glyphRun.positions) {\n glyphRun.positions.reverse();\n }\n }\n\n return this.GPOSProcessor && this.GPOSProcessor.features;\n }\n\n /**\n * @param {GlyphPositionLike[]} positions\n */\n zeroMarkAdvances(positions) {\n if (!this.glyphInfos) {\n return;\n }\n\n for (let i = 0; i < this.glyphInfos.length; i++) {\n if (this.glyphInfos[i].isMark) {\n positions[i].xAdvance = 0;\n positions[i].yAdvance = 0;\n }\n }\n }\n\n cleanup() {\n this.glyphInfos = null;\n this.plan = null;\n this.shaper = null;\n }\n\n /**\n * @param {ScriptTag | string[] | null | undefined} script\n * @param {LanguageTag | null | undefined} language\n * @returns {string[]}\n */\n getAvailableFeatures(script, language) {\n /** @type {string[]} */\n let features = [];\n\n if (this.GSUBProcessor) {\n this.GSUBProcessor.selectScript(script, language);\n features.push(...Object.keys(this.GSUBProcessor.features));\n }\n\n if (this.GPOSProcessor) {\n this.GPOSProcessor.selectScript(script, language);\n features.push(...Object.keys(this.GPOSProcessor.features));\n }\n\n return features;\n }\n}\n", "import KernProcessor from './KernProcessor';\nimport UnicodeLayoutEngine from './UnicodeLayoutEngine';\nimport GlyphRun from './GlyphRun';\nimport GlyphPosition from './GlyphPosition';\nimport * as Script from './Script';\nimport AATLayoutEngine from '../aat/AATLayoutEngine';\nimport OTLayoutEngine from '../opentype/OTLayoutEngine';\n\n/** @typedef {import('../../types/fontkit').LayoutFont} LayoutFont */\n/** @typedef {import('../../types/fontkit').LayoutGlyph} LayoutGlyph */\n/** @typedef {import('../../types/fontkit').FeatureInput} FeatureInput */\n/** @typedef {import('../../types/fontkit').FeatureMap} FeatureMap */\n/** @typedef {import('../../types/fontkit').ScriptTag} ScriptTag */\n/** @typedef {import('../../types/fontkit').LanguageTag} LanguageTag */\n/** @typedef {import('../../types/fontkit').TextDirection} TextDirection */\n/** @typedef {import('../../types/fontkit').AdvancedLayoutEngine} AdvancedLayoutEngine */\n/** @typedef {import('../../types/fontkit').GlyphRunLike} GlyphRunLike */\n/** @typedef {import('../../types/fontkit').GlyphPositionLike} GlyphPositionLike */\n/** @typedef {import('./GlyphRun').default} GlyphRunInstance */\n\nexport default class LayoutEngine {\n /**\n * @param {LayoutFont} font\n */\n constructor(font) {\n /** @type {LayoutFont} */\n this.font = font;\n /** @type {UnicodeLayoutEngine | null} */\n this.unicodeLayoutEngine = null;\n /** @type {KernProcessor | null} */\n this.kernProcessor = null;\n /** @type {AdvancedLayoutEngine | undefined} */\n this.engine = undefined;\n\n // Choose an advanced layout engine. We try the AAT morx table first since more\n // scripts are currently supported because the shaping logic is built into the font.\n if (this.font.morx) {\n this.engine = /** @type {AdvancedLayoutEngine} */ (new AATLayoutEngine(this.font));\n } else if (this.font.GSUB || this.font.GPOS) {\n this.engine = /** @type {AdvancedLayoutEngine} */ (new OTLayoutEngine(this.font));\n }\n }\n\n /**\n * @param {string | LayoutGlyph[]} string\n * @param {FeatureInput | ScriptTag | string[] | null | undefined} [features]\n * @param {ScriptTag | string[] | LanguageTag | null | undefined} [script]\n * @param {LanguageTag | TextDirection | null | undefined} [language]\n * @param {TextDirection | null | undefined} [direction]\n * @returns {GlyphRunInstance}\n */\n layout(string, features, script, language, direction) {\n // Make the features parameter optional\n if (typeof features === 'string') {\n direction = /** @type {TextDirection | null | undefined} */ (language);\n language = /** @type {LanguageTag | null | undefined} */ (script);\n script = features;\n features = [];\n }\n\n // Map string to glyphs if needed\n /** @type {LayoutGlyph[]} */\n let glyphs;\n if (typeof string === 'string') {\n // Attempt to detect the script from the string if not provided.\n if (script == null) {\n script = Script.forString(string);\n }\n\n glyphs = this.font.glyphsForString(string);\n } else {\n // Attempt to detect the script from the glyph code points if not provided.\n if (script == null) {\n /** @type {number[]} */\n let codePoints = [];\n for (let glyph of string) {\n codePoints.push(...glyph.codePoints);\n }\n\n script = Script.forCodePoints(codePoints);\n }\n\n glyphs = string;\n }\n\n let glyphRun = new GlyphRun(\n /** @type {import('../glyph/Glyph').default[]} */ (glyphs),\n /** @type {FeatureInput | null | undefined} */ (features),\n script,\n /** @type {LanguageTag | null | undefined} */ (language),\n /** @type {TextDirection | null | undefined} */ (direction)\n );\n\n // Return early if there are no glyphs\n if (glyphs.length === 0) {\n glyphRun.positions = [];\n return glyphRun;\n }\n\n // Setup the advanced layout engine\n if (this.engine && this.engine.setup) {\n this.engine.setup(/** @type {GlyphRunLike} */ (glyphRun));\n }\n\n // Substitute and position the glyphs\n this.substitute(glyphRun);\n this.position(glyphRun);\n\n if (glyphRun.positions) {\n this.hideDefaultIgnorables(/** @type {LayoutGlyph[]} */ (glyphRun.glyphs), glyphRun.positions);\n }\n\n // Let the layout engine clean up any state it might have\n if (this.engine && this.engine.cleanup) {\n this.engine.cleanup();\n }\n\n return glyphRun;\n }\n\n /**\n * @param {GlyphRunInstance} glyphRun\n */\n substitute(glyphRun) {\n // Call the advanced layout engine to make substitutions\n if (this.engine && this.engine.substitute) {\n this.engine.substitute(/** @type {GlyphRunLike} */ (glyphRun));\n }\n }\n\n /**\n * @param {GlyphRunInstance} glyphRun\n */\n position(glyphRun) {\n // Get initial glyph positions\n glyphRun.positions = /** @type {LayoutGlyph[]} */ (glyphRun.glyphs).map(\n /** @param {LayoutGlyph} glyph */ glyph => new GlyphPosition(glyph.advanceWidth)\n );\n /** @type {FeatureMap | Record<string, import('../../types/fontkit').OTFeature> | null | undefined | false} */\n let positioned = null;\n\n // Call the advanced layout engine. Returns the features applied.\n if (this.engine && this.engine.position) {\n positioned = this.engine.position(/** @type {GlyphRunLike} */ (glyphRun));\n }\n\n // if there is no GPOS table, use unicode properties to position marks.\n if (!positioned && (!this.engine || this.engine.fallbackPosition)) {\n if (!this.unicodeLayoutEngine) {\n this.unicodeLayoutEngine = new UnicodeLayoutEngine(this.font);\n }\n\n this.unicodeLayoutEngine.positionGlyphs(\n /** @type {LayoutGlyph[]} */ (glyphRun.glyphs),\n /** @type {GlyphPositionLike[]} */ (glyphRun.positions)\n );\n }\n\n // if kerning is not supported by GPOS, do kerning with the TrueType/AAT kern table\n if ((!positioned || !positioned.kern) && glyphRun.features.kern !== false && this.font.kern) {\n if (!this.kernProcessor) {\n this.kernProcessor = new KernProcessor(this.font);\n }\n\n this.kernProcessor.process(\n /** @type {LayoutGlyph[]} */ (glyphRun.glyphs),\n /** @type {GlyphPositionLike[]} */ (glyphRun.positions)\n );\n glyphRun.features.kern = true;\n }\n }\n\n /**\n * @param {LayoutGlyph[]} glyphs\n * @param {GlyphPositionLike[]} positions\n */\n hideDefaultIgnorables(glyphs, positions) {\n let space = this.font.glyphForCodePoint(0x20);\n if (!space) {\n return;\n }\n for (let i = 0; i < glyphs.length; i++) {\n if (this.isDefaultIgnorable(glyphs[i].codePoints[0])) {\n glyphs[i] = space;\n positions[i].xAdvance = 0;\n positions[i].yAdvance = 0;\n }\n }\n }\n\n /**\n * @param {number} ch\n * @returns {boolean}\n */\n isDefaultIgnorable(ch) {\n // From DerivedCoreProperties.txt in the Unicode database,\n // minus U+115F, U+1160, U+3164 and U+FFA0, which is what\n // Harfbuzz and Uniscribe do.\n let plane = ch >> 16;\n if (plane === 0) {\n // BMP\n switch (ch >> 8) {\n case 0x00: return ch === 0x00AD;\n case 0x03: return ch === 0x034F;\n case 0x06: return ch === 0x061C;\n case 0x17: return 0x17B4 <= ch && ch <= 0x17B5;\n case 0x18: return 0x180B <= ch && ch <= 0x180E;\n case 0x20: return (0x200B <= ch && ch <= 0x200F) || (0x202A <= ch && ch <= 0x202E) || (0x2060 <= ch && ch <= 0x206F);\n case 0xFE: return (0xFE00 <= ch && ch <= 0xFE0F) || ch === 0xFEFF;\n case 0xFF: return 0xFFF0 <= ch && ch <= 0xFFF8;\n default: return false;\n }\n } else {\n // Other planes\n switch (plane) {\n case 0x01: return (0x1BCA0 <= ch && ch <= 0x1BCA3) || (0x1D173 <= ch && ch <= 0x1D17A);\n case 0x0E: return 0xE0000 <= ch && ch <= 0xE0FFF;\n default: return false;\n }\n }\n }\n\n /**\n * @param {ScriptTag | string[] | null | undefined} [script]\n * @param {LanguageTag | null | undefined} [language]\n * @returns {string[]}\n */\n getAvailableFeatures(script, language) {\n /** @type {string[]} */\n let features = [];\n\n if (this.engine) {\n features.push(...this.engine.getAvailableFeatures(script, language));\n }\n\n if (this.font.kern && features.indexOf('kern') === -1) {\n features.push('kern');\n }\n\n return features;\n }\n\n /**\n * @param {number} gid\n * @returns {string[]}\n */\n stringsForGlyph(gid) {\n let result = new Set();\n\n let codePoints = this.font._cmapProcessor.codePointsForGlyph(gid);\n for (let codePoint of codePoints) {\n result.add(String.fromCodePoint(codePoint));\n }\n\n if (this.engine && this.engine.stringsForGlyph) {\n for (let string of this.engine.stringsForGlyph(gid)) {\n result.add(string);\n }\n }\n\n return Array.from(result);\n }\n}\n", "import BBox from './BBox';\n\n/** @typedef {import('../../types/fontkit').PathCommand} PathCommand */\n/** @typedef {import('../../types/fontkit').PathRenderingContext} PathRenderingContext */\n\n/** @type {Record<PathCommand['command'], string>} */\nconst SVG_COMMANDS = {\n moveTo: 'M',\n lineTo: 'L',\n quadraticCurveTo: 'Q',\n bezierCurveTo: 'C',\n closePath: 'Z'\n};\n\n/**\n * Path objects are returned by glyphs and represent the actual\n * vector outlines for each glyph in the font. Paths can be converted\n * to SVG path data strings, or to functions that can be applied to\n * render the path to a graphics context.\n */\nexport default class Path {\n constructor() {\n /** @type {PathCommand[]} */\n this.commands = [];\n /** @type {BBox | null} */\n this._bbox = null;\n /** @type {BBox | null} */\n this._cbox = null;\n }\n\n /**\n * @param {PathCommand['command']} command\n * @param {...number} args\n * @returns {this}\n */\n _addCommand(command, ...args) {\n this._bbox = this._cbox = null;\n this.commands.push({\n command,\n args\n });\n return this;\n }\n\n /**\n * @param {number} x\n * @param {number} y\n * @returns {this}\n */\n moveTo(x, y) {\n return this._addCommand('moveTo', x, y);\n }\n\n /**\n * @param {number} x\n * @param {number} y\n * @returns {this}\n */\n lineTo(x, y) {\n return this._addCommand('lineTo', x, y);\n }\n\n /**\n * @param {number} cpx\n * @param {number} cpy\n * @param {number} x\n * @param {number} y\n * @returns {this}\n */\n quadraticCurveTo(cpx, cpy, x, y) {\n return this._addCommand('quadraticCurveTo', cpx, cpy, x, y);\n }\n\n /**\n * @param {number} cp1x\n * @param {number} cp1y\n * @param {number} cp2x\n * @param {number} cp2y\n * @param {number} x\n * @param {number} y\n * @returns {this}\n */\n bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {\n return this._addCommand('bezierCurveTo', cp1x, cp1y, cp2x, cp2y, x, y);\n }\n\n /**\n * @returns {this}\n */\n closePath() {\n return this._addCommand('closePath');\n }\n\n /**\n * Compiles the path to a JavaScript function that can be applied with\n * a graphics context in order to render the path.\n * @return {(ctx: PathRenderingContext) => void}\n */\n toFunction() {\n /**\n * @param {PathRenderingContext} ctx\n * @returns {void}\n */\n return (ctx) => {\n this.commands.forEach((c) => {\n const fn = ctx[c.command];\n if (typeof fn === 'function') {\n Reflect.apply(fn, ctx, c.args);\n }\n });\n };\n }\n\n /**\n * Converts the path to an SVG path data string\n * @return {string}\n */\n toSVG() {\n let cmds = this.commands.map((c) => {\n let args = c.args.map(/** @param {number} arg */ arg => Math.round(arg * 100) / 100);\n return `${SVG_COMMANDS[c.command]}${args.join(' ')}`;\n });\n\n return cmds.join('');\n }\n\n /**\n * Gets the \"control box\" of a path.\n * This is like the bounding box, but it includes all points including\n * control points of bezier segments and is much faster to compute than\n * the real bounding box.\n * @type {BBox}\n */\n get cbox() {\n if (!this._cbox) {\n if (this.commands.length === 0) {\n this._cbox = Object.freeze(new BBox(0, 0, 0, 0));\n } else {\n let cbox = new BBox();\n for (let command of this.commands) {\n for (let i = 0; i < command.args.length; i += 2) {\n cbox.addPoint(command.args[i], command.args[i + 1]);\n }\n }\n\n this._cbox = Object.freeze(cbox);\n }\n }\n\n return this._cbox;\n }\n\n /**\n * Gets the exact bounding box of the path by evaluating curve segments.\n * Slower to compute than the control box, but more accurate.\n * @type {BBox}\n */\n get bbox() {\n if (this._bbox) {\n return this._bbox;\n }\n\n if (this.commands.length === 0) {\n return this._bbox = Object.freeze(new BBox(0, 0, 0, 0));\n }\n\n let bbox = new BBox();\n let cx = 0, cy = 0;\n\n for (let c of this.commands) {\n switch (c.command) {\n case 'moveTo':\n case 'lineTo': {\n let [x, y] = c.args;\n bbox.addPoint(x, y);\n cx = x;\n cy = y;\n break;\n }\n\n case 'quadraticCurveTo':\n case 'bezierCurveTo': {\n let cp1x, cp1y, cp2x, cp2y, p3x, p3y;\n if (c.command === 'quadraticCurveTo') {\n // http://fontforge.org/bezier.html\n let [qp1x, qp1y, qp3x, qp3y] = c.args;\n p3x = qp3x;\n p3y = qp3y;\n cp1x = cx + 2 / 3 * (qp1x - cx); // CP1 = QP0 + 2/3 * (QP1-QP0)\n cp1y = cy + 2 / 3 * (qp1y - cy);\n cp2x = p3x + 2 / 3 * (qp1x - p3x); // CP2 = QP2 + 2/3 * (QP1-QP2)\n cp2y = p3y + 2 / 3 * (qp1y - p3y);\n } else {\n [cp1x, cp1y, cp2x, cp2y, p3x, p3y] = c.args;\n }\n\n // http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n bbox.addPoint(p3x, p3y);\n\n let p0 = [cx, cy];\n let p1 = [cp1x, cp1y];\n let p2 = [cp2x, cp2y];\n let p3 = [p3x, p3y];\n\n /**\n * @param {number} t\n * @param {number} i\n * @returns {number}\n */\n let f = (t, i) => (\n Math.pow(1 - t, 3) * p0[i]\n + 3 * Math.pow(1 - t, 2) * t * p1[i]\n + 3 * (1 - t) * Math.pow(t, 2) * p2[i]\n + Math.pow(t, 3) * p3[i]\n );\n\n for (let i = 0; i <= 1; i++) {\n let b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i];\n let a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i];\n // Renamed from `c` \u2014 reassigning the PathCommand loop variable to a number\n // would corrupt subsequent iterations / confuse the type checker.\n let coeff = 3 * p1[i] - 3 * p0[i];\n\n if (a === 0) {\n if (b === 0) {\n continue;\n }\n\n let t = -coeff / b;\n if (0 < t && t < 1) {\n if (i === 0) {\n bbox.addPoint(f(t, i), bbox.maxY);\n } else if (i === 1) {\n bbox.addPoint(bbox.maxX, f(t, i));\n }\n }\n\n continue;\n }\n\n let b2ac = Math.pow(b, 2) - 4 * coeff * a;\n if (b2ac < 0) {\n continue;\n }\n\n let t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n if (0 < t1 && t1 < 1) {\n if (i === 0) {\n bbox.addPoint(f(t1, i), bbox.maxY);\n } else if (i === 1) {\n bbox.addPoint(bbox.maxX, f(t1, i));\n }\n }\n\n let t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n if (0 < t2 && t2 < 1) {\n if (i === 0) {\n bbox.addPoint(f(t2, i), bbox.maxY);\n } else if (i === 1) {\n bbox.addPoint(bbox.maxX, f(t2, i));\n }\n }\n }\n\n cx = p3x;\n cy = p3y;\n break;\n }\n }\n }\n\n return this._bbox = Object.freeze(bbox);\n }\n\n /**\n * Applies a mapping function to each point in the path.\n * @param {(x: number, y: number) => [number, number]} fn\n * @return {Path}\n */\n mapPoints(fn) {\n let path = new Path();\n\n for (let c of this.commands) {\n let args = [];\n for (let i = 0; i < c.args.length; i += 2) {\n let [x, y] = fn(c.args[i], c.args[i + 1]);\n args.push(x, y);\n }\n\n path._addCommand(c.command, ...args);\n }\n\n return path;\n }\n\n /**\n * Transforms the path by the given matrix.\n * @param {number} m0\n * @param {number} m1\n * @param {number} m2\n * @param {number} m3\n * @param {number} m4\n * @param {number} m5\n * @returns {Path}\n */\n transform(m0, m1, m2, m3, m4, m5) {\n return this.mapPoints((x, y) => {\n const tx = m0 * x + m2 * y + m4;\n const ty = m1 * x + m3 * y + m5;\n return [tx, ty];\n });\n }\n\n /**\n * Translates the path by the given offset.\n * @param {number} x\n * @param {number} y\n * @returns {Path}\n */\n translate(x, y) {\n return this.transform(1, 0, 0, 1, x, y);\n }\n\n /**\n * Rotates the path by the given angle (in radians).\n * @param {number} angle\n * @returns {Path}\n */\n rotate(angle) {\n let cos = Math.cos(angle);\n let sin = Math.sin(angle);\n return this.transform(cos, sin, -sin, cos, 0, 0);\n }\n\n /**\n * Scales the path.\n * @param {number} scaleX\n * @param {number} [scaleY]\n * @returns {Path}\n */\n scale(scaleX, scaleY = scaleX) {\n return this.transform(scaleX, 0, 0, scaleY, 0, 0);\n }\n}\n", "/** @type {string[]} */\nexport default [\n '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',\n 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',\n 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',\n 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',\n 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',\n 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',\n 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',\n 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave',\n 'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',\n 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis',\n 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section',\n 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal',\n 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation',\n 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown',\n 'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright',\n 'ellipsis', 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft',\n 'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',\n 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase',\n 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',\n 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex',\n 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',\n 'ogonek', 'caron', 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', 'Eth', 'eth',\n 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', 'onesuperior', 'twosuperior', 'threesuperior',\n 'onehalf', 'onequarter', 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', 'scedilla',\n 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'\n];\n", "import { cache } from '../decorators';\nimport Path from './Path';\nimport { isMark } from '../packages/unicode-properties/index.js';\nimport StandardNames from './StandardNames';\n\n/** @typedef {import('../../types/fontkit').FontLike} FontLike */\n/** @typedef {import('../../types/fontkit').GlyphMetrics} GlyphMetrics */\n/** @typedef {import('../../types/fontkit').MetricsTable} MetricsTable */\n/** @typedef {import('../../types/fontkit').PathRenderingContext} PathRenderingContext */\n/** @typedef {import('./BBox').default} BBox */\n\n/**\n * Glyph objects represent a glyph in the font. They have various properties for accessing metrics and\n * the actual vector path the glyph represents, and methods for rendering the glyph to a graphics context.\n *\n * You do not create glyph objects directly. They are created by various methods on the font object.\n * There are several subclasses of the base Glyph class internally that may be returned depending\n * on the font format, but they all inherit from this class.\n */\nexport default class Glyph {\n /**\n * @param {number} id\n * @param {number[]} codePoints\n * @param {FontLike} font\n */\n constructor(id, codePoints, font) {\n /**\n * The glyph id in the font\n * @type {number}\n */\n this.id = id;\n\n /**\n * An array of unicode code points that are represented by this glyph.\n * There can be multiple code points in the case of ligatures and other glyphs\n * that represent multiple visual characters.\n * @type {number[]}\n */\n this.codePoints = codePoints;\n\n /** @type {FontLike} */\n this._font = font;\n\n /** @type {GlyphMetrics | undefined} */\n this._metrics = undefined;\n\n // TODO: get this info from GDEF if available\n this.isMark = this.codePoints.length > 0 && this.codePoints.every(isMark);\n this.isLigature = this.codePoints.length > 1;\n }\n\n /**\n * @returns {Path}\n */\n _getPath() {\n return new Path();\n }\n\n /**\n * @returns {BBox}\n */\n _getCBox() {\n return this.path.cbox;\n }\n\n /**\n * @returns {BBox}\n */\n _getBBox() {\n return this.path.bbox;\n }\n\n /**\n * @param {MetricsTable} table\n * @returns {{ advance: number, bearing: number }}\n */\n _getTableMetrics(table) {\n if (this.id < table.metrics.length) {\n let metric = table.metrics.get(this.id);\n return {\n advance: metric ? metric.advance : 0,\n bearing: metric ? metric.bearing : 0\n };\n }\n\n let metric = table.metrics.get(table.metrics.length - 1);\n let res = {\n advance: metric ? metric.advance : 0,\n bearing: table.bearings.get(this.id - table.metrics.length) || 0\n };\n\n return res;\n }\n\n /**\n * @param {BBox} [cbox]\n * @returns {GlyphMetrics}\n */\n _getMetrics(cbox) {\n if (this._metrics) { return this._metrics; }\n if (cbox == null) { ({ cbox } = this); }\n\n let { advance: advanceWidth, bearing: leftBearing } = this._getTableMetrics(this._font.hmtx);\n\n // Vertical metrics: vmtx, else font ascent/descent (respects useTypoMetrics)\n let advanceHeight, topBearing;\n if (this._font.vmtx) {\n ({ advance: advanceHeight, bearing: topBearing } = this._getTableMetrics(this._font.vmtx));\n } else {\n advanceHeight = Math.abs(this._font.ascent - this._font.descent);\n topBearing = this._font.ascent - cbox.maxY;\n }\n\n if (this._font._variationProcessor && this._font.HVAR) {\n advanceWidth += this._font._variationProcessor.getAdvanceAdjustment(this.id, this._font.HVAR);\n }\n\n let { width, height } = cbox;\n return this._metrics = {\n width,\n height,\n advanceWidth,\n advanceHeight,\n leftBearing,\n topBearing,\n rightBearing: advanceWidth - leftBearing - width,\n bottomBearing: advanceHeight - topBearing - height\n };\n }\n\n /**\n * The glyph\u2019s control box.\n * This is often the same as the bounding box, but is faster to compute.\n * Because of the way bezier curves are defined, some of the control points\n * can be outside of the bounding box. Where `bbox` takes this into account,\n * `cbox` does not. Thus, cbox is less accurate, but faster to compute.\n * See [here](http://www.freetype.org/freetype2/docs/glyphs/glyphs-6.html#section-2)\n * for a more detailed description.\n *\n * @type {BBox}\n */\n @cache\n get cbox() {\n return this._getCBox();\n }\n\n /**\n * The glyph\u2019s bounding box, i.e. the rectangle that encloses the\n * glyph outline as tightly as possible.\n * @type {BBox}\n */\n @cache\n get bbox() {\n return this._getBBox();\n }\n\n /**\n * A vector Path object representing the glyph outline.\n * @type {Path}\n */\n @cache\n get path() {\n // Cache the path so we only decode it once\n // Decoding is actually performed by subclasses\n return this._getPath();\n }\n\n /**\n * Returns a path scaled to the given font size.\n * @param {number} size\n * @return {Path}\n */\n getScaledPath(size) {\n let scale = 1 / this._font.unitsPerEm * size;\n return this.path.scale(scale);\n }\n\n /**\n * The glyph's width.\n * @type {number}\n */\n @cache\n get width() {\n return this._getMetrics().width;\n }\n\n /**\n * The glyph's height.\n * @type {number}\n */\n @cache\n get height() {\n return this._getMetrics().height;\n }\n\n /**\n * The glyph's advance width.\n * @type {number}\n */\n @cache\n get advanceWidth() {\n return this._getMetrics().advanceWidth;\n }\n\n /**\n * The glyph's advance height.\n * @type {number}\n */\n @cache\n get advanceHeight() {\n return this._getMetrics().advanceHeight;\n }\n\n /**\n * The glyph's left side bearing.\n * @type {number}\n */\n @cache\n get leftBearing() {\n return this._getMetrics().leftBearing;\n }\n\n /**\n * The glyph's top side bearing.\n * @type {number}\n */\n @cache\n get topBearing() {\n return this._getMetrics().topBearing;\n }\n\n /**\n * The glyph's right side bearing.\n * @type {number}\n */\n @cache\n get rightBearing() {\n return this._getMetrics().rightBearing;\n }\n\n /**\n * The glyph's bottom side bearing.\n * @type {number}\n */\n @cache\n get bottomBearing() {\n return this._getMetrics().bottomBearing;\n }\n\n /**\n * @returns {null}\n */\n get ligatureCaretPositions() {\n return null;\n }\n\n /**\n * @returns {string | null | undefined}\n */\n _getName() {\n let { post } = this._font;\n if (!post) {\n return null;\n }\n\n switch (post.version) {\n case 1:\n return StandardNames[this.id];\n\n case 2: {\n let id = post.glyphNameIndex?.[this.id];\n if (id == null) {\n return null;\n }\n if (id < StandardNames.length) {\n return StandardNames[id];\n }\n\n return post.names?.[id - StandardNames.length];\n }\n\n case 2.5: {\n let offset = post.offsets?.[this.id];\n if (offset == null) {\n return null;\n }\n return StandardNames[this.id + offset];\n }\n\n case 4: {\n let mapped = post.map?.[this.id];\n if (mapped == null) {\n return null;\n }\n return String.fromCharCode(mapped);\n }\n }\n\n return null;\n }\n\n /**\n * The glyph's name\n * @type {string | null | undefined}\n */\n @cache\n get name() {\n return this._getName();\n }\n\n /**\n * Renders the glyph to the given graphics context, at the specified font size.\n * @param {PathRenderingContext} ctx\n * @param {number} size\n * @returns {void}\n */\n render(ctx, size) {\n ctx.save();\n\n let scale = 1 / this._font.head.unitsPerEm * size;\n ctx.scale(scale, scale);\n\n let fn = this.path.toFunction();\n fn(ctx);\n ctx.fill();\n\n ctx.restore();\n }\n}\n", "import Glyph from './Glyph';\nimport Path from './Path';\nimport BBox from './BBox';\nimport * as r from 'restructure';\n\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('../../types/fontkit').DecodedGlyf} DecodedGlyf */\n/** @typedef {import('../../types/fontkit').GlyphComponent} GlyphComponent */\n/** @typedef {import('../../types/fontkit').GlyphMetrics} GlyphMetrics */\n/** @typedef {import('../../types/fontkit').GlyphPoint} GlyphPoint */\n\n// The header for both simple and composite glyphs\nlet GlyfHeader = new r.Struct({\n numberOfContours: r.int16, // if negative, this is a composite glyph\n xMin: r.int16,\n yMin: r.int16,\n xMax: r.int16,\n yMax: r.int16\n});\n\n// Flags for simple glyphs\nconst ON_CURVE = 1 << 0;\nconst X_SHORT_VECTOR = 1 << 1;\nconst Y_SHORT_VECTOR = 1 << 2;\nconst REPEAT = 1 << 3;\nconst SAME_X = 1 << 4;\nconst SAME_Y = 1 << 5;\n\n// Flags for composite glyphs\nconst ARG_1_AND_2_ARE_WORDS = 1 << 0;\nconst _ARGS_ARE_XY_VALUES = 1 << 1;\nconst _ROUND_XY_TO_GRID = 1 << 2;\nconst WE_HAVE_A_SCALE = 1 << 3;\nconst MORE_COMPONENTS = 1 << 5;\nconst WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;\nconst WE_HAVE_A_TWO_BY_TWO = 1 << 7;\nconst WE_HAVE_INSTRUCTIONS = 1 << 8;\nconst _USE_MY_METRICS = 1 << 9;\nconst _OVERLAP_COMPOUND = 1 << 10;\nconst _SCALED_COMPONENT_OFFSET = 1 << 11;\nconst _UNSCALED_COMPONENT_OFFSET = 1 << 12;\n\n/**\n * @param {StructValue} raw\n * @returns {DecodedGlyf}\n */\nfunction decodeGlyfHeader(raw) {\n let numberOfContours = raw.numberOfContours;\n let xMin = raw.xMin;\n let yMin = raw.yMin;\n let xMax = raw.xMax;\n let yMax = raw.yMax;\n if (\n typeof numberOfContours !== 'number'\n || typeof xMin !== 'number'\n || typeof yMin !== 'number'\n || typeof xMax !== 'number'\n || typeof yMax !== 'number'\n ) {\n throw new Error('Invalid glyf header');\n }\n return { numberOfContours, xMin, yMin, xMax, yMax };\n}\n\n/**\n * @param {unknown[]} values\n * @returns {number[]}\n */\nfunction asNumberArray(values) {\n /** @type {number[]} */\n let out = [];\n for (let i = 0; i < values.length; i++) {\n let v = values[i];\n if (typeof v !== 'number') {\n throw new Error('Expected number array from glyf decode');\n }\n out.push(v);\n }\n return out;\n}\n\n// Represents a point in a simple glyph\nexport class Point {\n /**\n * @param {boolean} onCurve\n * @param {boolean} endContour\n * @param {number} [x]\n * @param {number} [y]\n */\n constructor(onCurve, endContour, x = 0, y = 0) {\n /** @type {boolean} */\n this.onCurve = onCurve;\n /** @type {boolean} */\n this.endContour = endContour;\n /** @type {number} */\n this.x = x;\n /** @type {number} */\n this.y = y;\n }\n\n /**\n * @returns {Point}\n */\n copy() {\n return new Point(this.onCurve, this.endContour, this.x, this.y);\n }\n}\n\n// Represents a component in a composite glyph\nclass Component {\n /**\n * @param {number} glyphID\n * @param {number} dx\n * @param {number} dy\n */\n constructor(glyphID, dx, dy) {\n /** @type {number} */\n this.glyphID = glyphID;\n /** @type {number} */\n this.dx = dx;\n /** @type {number} */\n this.dy = dy;\n /** @type {number} */\n this.pos = 0;\n /** @type {number} */\n this.scaleX = 1;\n /** @type {number} */\n this.scaleY = 1;\n /** @type {number} */\n this.scale01 = 0;\n /** @type {number} */\n this.scale10 = 0;\n }\n}\n\n/**\n * Represents a TrueType glyph.\n */\nexport default class TTFGlyph extends Glyph {\n type = 'TTF';\n\n /**\n * Parses just the glyph header and returns the bounding box\n * @param {boolean} [internal]\n * @returns {BBox}\n */\n _getCBox(internal) {\n // We need to decode the glyph if variation processing is requested,\n // so it's easier just to recompute the path's cbox after decoding.\n if (this._font._variationProcessor && !internal) {\n return this.path.cbox;\n }\n\n let loca = this._font.loca;\n if (!loca) {\n return Object.freeze(new BBox(0, 0, 0, 0));\n }\n\n let glyfPos = loca.offsets[this.id];\n // No outline data (e.g. space): avoid decoding the next glyph's header\n if (glyfPos === loca.offsets[this.id + 1]) {\n return Object.freeze(new BBox(0, 0, 0, 0));\n }\n\n let stream = this._font._getTableStream('glyf');\n if (!stream) {\n return Object.freeze(new BBox(0, 0, 0, 0));\n }\n stream.pos += glyfPos;\n let glyph = decodeGlyfHeader(GlyfHeader.decode(stream));\n return Object.freeze(new BBox(glyph.xMin, glyph.yMin, glyph.xMax, glyph.yMax));\n }\n\n /**\n * Parses a single glyph coordinate\n * @param {DecodeStream} stream\n * @param {number} prev\n * @param {number} short\n * @param {number} same\n * @returns {number}\n */\n _parseGlyphCoord(stream, prev, short, same) {\n let val;\n if (short) {\n val = stream.readUInt8();\n if (!same) {\n val = -val;\n }\n\n val += prev;\n } else {\n if (same) {\n val = prev;\n } else {\n val = prev + stream.readInt16BE();\n }\n }\n\n return val;\n }\n\n /**\n * Decodes the glyph data into points for simple glyphs,\n * or components for composite glyphs\n * @returns {DecodedGlyf | null}\n */\n _decode() {\n let loca = this._font.loca;\n if (!loca) {\n return null;\n }\n\n let glyfPos = loca.offsets[this.id];\n let nextPos = loca.offsets[this.id + 1];\n\n // Nothing to do if there is no data for this glyph\n if (glyfPos === nextPos) { return null; }\n\n let stream = this._font._getTableStream('glyf');\n if (!stream) {\n return null;\n }\n stream.pos += glyfPos;\n let startPos = stream.pos;\n\n let glyph = decodeGlyfHeader(GlyfHeader.decode(stream));\n\n if (glyph.numberOfContours > 0) {\n this._decodeSimple(glyph, stream);\n } else if (glyph.numberOfContours < 0) {\n this._decodeComposite(glyph, stream, startPos);\n }\n\n return glyph;\n }\n\n /**\n * @param {DecodedGlyf} glyph\n * @param {DecodeStream} stream\n * @returns {void}\n */\n _decodeSimple(glyph, stream) {\n // this is a simple glyph\n glyph.points = [];\n\n let endPtsOfContours = asNumberArray(new r.Array(r.uint16, glyph.numberOfContours).decode(stream));\n glyph.instructions = asNumberArray(new r.Array(r.uint8, r.uint16).decode(stream));\n\n /** @type {number[]} */\n let flags = [];\n let numCoords = endPtsOfContours[endPtsOfContours.length - 1] + 1;\n\n while (flags.length < numCoords) {\n let flag = stream.readUInt8();\n flags.push(flag);\n\n // check for repeat flag\n if (flag & REPEAT) {\n let count = stream.readUInt8();\n for (let j = 0; j < count; j++) {\n flags.push(flag);\n }\n }\n }\n\n for (let i = 0; i < flags.length; i++) {\n let flag = flags[i];\n let point = new Point(!!(flag & ON_CURVE), endPtsOfContours.indexOf(i) >= 0, 0, 0);\n glyph.points.push(point);\n }\n\n let px = 0;\n for (let i = 0; i < flags.length; i++) {\n let flag = flags[i];\n let point = glyph.points[i];\n point.x = px = this._parseGlyphCoord(stream, px, flag & X_SHORT_VECTOR, flag & SAME_X);\n }\n\n let py = 0;\n for (let i = 0; i < flags.length; i++) {\n let flag = flags[i];\n let point = glyph.points[i];\n point.y = py = this._parseGlyphCoord(stream, py, flag & Y_SHORT_VECTOR, flag & SAME_Y);\n }\n\n if (this._font._variationProcessor) {\n let points = glyph.points.slice();\n points.push(...this._getPhantomPoints(glyph));\n\n this._font._variationProcessor.transformPoints(this.id, points);\n glyph.phantomPoints = points.slice(-4);\n }\n\n return;\n }\n\n /**\n * @param {DecodedGlyf} glyph\n * @param {DecodeStream} stream\n * @param {number} [offset]\n * @returns {boolean}\n */\n _decodeComposite(glyph, stream, offset = 0) {\n // this is a composite glyph\n glyph.components = [];\n let haveInstructions = false;\n let flags = MORE_COMPONENTS;\n\n while (flags & MORE_COMPONENTS) {\n flags = stream.readUInt16BE();\n let gPos = stream.pos - offset;\n let glyphID = stream.readUInt16BE();\n if (!haveInstructions) {\n haveInstructions = (flags & WE_HAVE_INSTRUCTIONS) !== 0;\n }\n\n let dx, dy;\n if (flags & ARG_1_AND_2_ARE_WORDS) {\n dx = stream.readInt16BE();\n dy = stream.readInt16BE();\n } else {\n dx = stream.readInt8();\n dy = stream.readInt8();\n }\n\n let component = new Component(glyphID, dx, dy);\n component.pos = gPos;\n\n if (flags & WE_HAVE_A_SCALE) {\n // fixed number with 14 bits of fraction\n component.scaleX\n = component.scaleY = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {\n component.scaleX = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n component.scaleY = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n } else if (flags & WE_HAVE_A_TWO_BY_TWO) {\n component.scaleX = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n component.scale01 = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n component.scale10 = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n component.scaleY = ((stream.readUInt8() << 24) | (stream.readUInt8() << 16)) / 1073741824;\n }\n\n glyph.components.push(component);\n }\n\n if (this._font._variationProcessor) {\n /** @type {Point[]} */\n let points = [];\n for (let j = 0; j < glyph.components.length; j++) {\n let component = glyph.components[j];\n points.push(new Point(true, true, component.dx, component.dy));\n }\n\n points.push(...this._getPhantomPoints(glyph));\n\n this._font._variationProcessor.transformPoints(this.id, points);\n glyph.phantomPoints = points.splice(-4, 4);\n\n for (let i = 0; i < points.length; i++) {\n let point = points[i];\n glyph.components[i].dx = point.x;\n glyph.components[i].dy = point.y;\n }\n }\n\n return haveInstructions;\n }\n\n /**\n * @param {DecodedGlyf} glyph\n * @returns {Point[]}\n */\n _getPhantomPoints(glyph) {\n let cbox = this._getCBox(true);\n if (this._metrics == null) {\n this._metrics = Glyph.prototype._getMetrics.call(this, cbox);\n }\n\n let { advanceWidth, advanceHeight, leftBearing, topBearing } = this._metrics;\n\n return [\n new Point(false, true, glyph.xMin - leftBearing, 0),\n new Point(false, true, glyph.xMin - leftBearing + advanceWidth, 0),\n new Point(false, true, 0, glyph.yMax + topBearing),\n new Point(false, true, 0, glyph.yMax + topBearing + advanceHeight)\n ];\n }\n\n /**\n * Decodes font data, resolves composite glyphs, and returns an array of contours\n * @returns {Point[][]}\n */\n _getContours() {\n let glyph = this._decode();\n if (!glyph) {\n return [];\n }\n\n /** @type {Point[]} */\n let points = [];\n\n if (glyph.numberOfContours < 0) {\n // resolve composite glyphs\n let components = glyph.components || [];\n for (let component of components) {\n let componentGlyph = this._font._getBaseGlyph(component.glyphID);\n if (!componentGlyph || typeof componentGlyph._getContours !== 'function') {\n continue;\n }\n\n let contours = componentGlyph._getContours();\n for (let i = 0; i < contours.length; i++) {\n let contour = contours[i];\n for (let j = 0; j < contour.length; j++) {\n let point = contour[j];\n let x = point.x * component.scaleX + point.y * component.scale01 + component.dx;\n let y = point.y * component.scaleY + point.x * component.scale10 + component.dy;\n points.push(new Point(point.onCurve, point.endContour, x, y));\n }\n }\n }\n } else {\n points = glyph.points || [];\n }\n\n // Recompute and cache metrics if we performed variation processing, and don't have an HVAR table\n if (glyph.phantomPoints && !this._font.directory.tables.HVAR) {\n let m = this._metrics;\n if (m) {\n m.advanceWidth = glyph.phantomPoints[1].x - glyph.phantomPoints[0].x;\n m.advanceHeight = glyph.phantomPoints[3].y - glyph.phantomPoints[2].y;\n m.leftBearing = glyph.xMin - glyph.phantomPoints[0].x;\n m.topBearing = glyph.phantomPoints[2].y - glyph.yMax;\n m.rightBearing = m.advanceWidth - m.leftBearing - m.width;\n m.bottomBearing = m.advanceHeight - m.topBearing - m.height;\n }\n }\n\n /** @type {Point[][]} */\n let contours = [];\n /** @type {Point[]} */\n let cur = [];\n for (let k = 0; k < points.length; k++) {\n let point = points[k];\n cur.push(point);\n if (point.endContour) {\n contours.push(cur);\n cur = [];\n }\n }\n\n return contours;\n }\n\n /**\n * @returns {GlyphMetrics}\n */\n _getMetrics() {\n if (this._metrics) {\n return this._metrics;\n }\n\n let cbox = this._getCBox(true);\n super._getMetrics(cbox);\n\n if (this._font._variationProcessor && !this._font.HVAR) {\n // No HVAR table, decode the glyph. This triggers recomputation of metrics.\n this.path;\n }\n\n // super._getMetrics always assigns this._metrics\n let metrics = this._metrics;\n if (!metrics) {\n throw new Error('Failed to compute glyph metrics');\n }\n return metrics;\n }\n\n /**\n * Converts contours to a Path object that can be rendered\n * @returns {Path}\n */\n _getPath() {\n let contours = this._getContours();\n let path = new Path();\n\n for (let i = 0; i < contours.length; i++) {\n let contour = contours[i];\n let firstPt = contour[0];\n let lastPt = contour[contour.length - 1];\n let start = 0;\n /** @type {Point | null} */\n let curvePt = null;\n\n if (firstPt.onCurve) {\n // The first point will be consumed by the moveTo command, so skip in the loop\n curvePt = null;\n start = 1;\n } else {\n if (lastPt.onCurve) {\n // Start at the last point if the first point is off curve and the last point is on curve\n firstPt = lastPt;\n } else {\n // Start at the middle if both the first and last points are off curve\n firstPt = new Point(false, false, (firstPt.x + lastPt.x) / 2, (firstPt.y + lastPt.y) / 2);\n }\n\n curvePt = firstPt;\n }\n\n path.moveTo(firstPt.x, firstPt.y);\n\n for (let j = start; j < contour.length; j++) {\n let pt = contour[j];\n let prevPt = j === 0 ? firstPt : contour[j - 1];\n\n if (prevPt.onCurve && pt.onCurve) {\n path.lineTo(pt.x, pt.y);\n } else if (prevPt.onCurve && !pt.onCurve) {\n curvePt = pt;\n } else if (!prevPt.onCurve && !pt.onCurve) {\n let midX = (prevPt.x + pt.x) / 2;\n let midY = (prevPt.y + pt.y) / 2;\n path.quadraticCurveTo(prevPt.x, prevPt.y, midX, midY);\n curvePt = pt;\n } else if (!prevPt.onCurve && pt.onCurve) {\n if (!curvePt) {\n throw new Error('Unknown TTF path state');\n }\n path.quadraticCurveTo(curvePt.x, curvePt.y, pt.x, pt.y);\n curvePt = null;\n } else {\n throw new Error('Unknown TTF path state');\n }\n }\n\n // Connect the first and last points\n if (curvePt) {\n path.quadraticCurveTo(curvePt.x, curvePt.y, firstPt.x, firstPt.y);\n }\n\n path.closePath();\n }\n\n return path;\n }\n}\n", "import Glyph from './Glyph';\nimport Path from './Path';\nimport { StandardEncoding } from '../cff/CFFEncodings';\n\n/** @typedef {import('../../types/fontkit').CFFCharString} CFFCharString */\n/** @typedef {import('../../types/fontkit').CFFFontLike} CFFFontLike */\n/** @typedef {import('../../types/fontkit').GlyphLike} GlyphLike */\n/** @typedef {import('../../types/fontkit').ItemVariationStore} ItemVariationStore */\n\n/**\n * @param {unknown} value\n * @returns {value is CFFCharString}\n */\nfunction isCFFCharString(value) {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n let offset = Reflect.get(value, 'offset');\n let length = Reflect.get(value, 'length');\n return typeof offset === 'number' && typeof length === 'number';\n}\n\n/**\n * Represents an OpenType PostScript glyph, in the Compact Font Format.\n */\nexport default class CFFGlyph extends Glyph {\n type = 'CFF';\n\n /**\n * Subroutines used while decoding; set during `_getPath`.\n * @type {Record<number, boolean> | undefined}\n */\n _usedGsubrs;\n\n /**\n * Local subroutines used while decoding; set during `_getPath`.\n * @type {Record<number, boolean> | undefined}\n */\n _usedSubrs;\n\n /**\n * @returns {string | null | undefined}\n */\n _getName() {\n if (this._font.CFF2) {\n return super._getName();\n }\n\n let cff = this._font['CFF '];\n if (!cff || typeof cff.getGlyphName !== 'function') {\n return null;\n }\n return cff.getGlyphName(this.id);\n }\n\n /**\n * @param {{ length: number }} s\n * @returns {number}\n */\n bias(s) {\n if (s.length < 1240) {\n return 107;\n } else if (s.length < 33900) {\n return 1131;\n } else {\n return 32768;\n }\n }\n\n /**\n * @returns {Path}\n */\n _getPath() {\n let cff = this._font.CFF2 || this._font['CFF '];\n if (!cff) {\n return new Path();\n }\n /** @type {CFFFontLike} */\n let cffFont = cff;\n let { stream } = cffFont;\n let rawStr = cffFont.topDict.CharStrings[this.id];\n if (!isCFFCharString(rawStr)) {\n return new Path();\n }\n let str = rawStr;\n let end = str.offset + str.length;\n stream.pos = str.offset;\n\n let path = new Path();\n /** @type {number[]} */\n let stack = [];\n /** @type {number[]} */\n let trans = [];\n\n /** @type {number | null} */\n let width = null;\n let nStems = 0;\n let x = 0, y = 0;\n /** @type {Record<number, boolean>} */\n let usedGsubrs;\n /** @type {Record<number, boolean>} */\n let usedSubrs;\n let open = false;\n\n this._usedGsubrs = usedGsubrs = {};\n this._usedSubrs = usedSubrs = {};\n\n let gsubrs = cffFont.globalSubrIndex || [];\n let gsubrsBias = this.bias(gsubrs);\n\n let fetchedPrivate = cffFont.privateDictForGlyph(this.id);\n /** @type {import('../../types/fontkit').CFFPrivateDict} */\n let privateDict = fetchedPrivate ? fetchedPrivate : {};\n /** @type {CFFCharString[]} */\n let subrs = [];\n if (Array.isArray(privateDict.Subrs)) {\n for (let entry of privateDict.Subrs) {\n if (isCFFCharString(entry)) {\n subrs.push(entry);\n }\n }\n }\n let subrsBias = this.bias(subrs);\n let nominalWidthX = typeof privateDict.nominalWidthX === 'number' ? privateDict.nominalWidthX : 0;\n\n /** @type {ItemVariationStore | undefined} */\n let vstore = (cffFont.topDict.vstore && cffFont.topDict.vstore.itemVariationStore) || undefined;\n /** @type {number} */\n let vsindex = typeof privateDict.vsindex === 'number' ? privateDict.vsindex : 0;\n let variationProcessor = this._font._variationProcessor;\n let font = this._font;\n\n /**\n * @returns {number}\n */\n function shiftStack() {\n let v = stack.shift();\n if (v === undefined) {\n throw new Error('CFF stack underflow');\n }\n return v;\n }\n\n /**\n * @returns {number}\n */\n function popStack() {\n let v = stack.pop();\n if (v === undefined) {\n throw new Error('CFF stack underflow');\n }\n return v;\n }\n\n /**\n * @returns {void}\n */\n function checkWidth() {\n if (width == null) {\n width = shiftStack() + nominalWidthX;\n }\n }\n\n /**\n * @returns {number}\n */\n function parseStems() {\n if (stack.length % 2 !== 0) {\n checkWidth();\n }\n\n nStems += stack.length >> 1;\n return stack.length = 0;\n }\n\n /**\n * @param {number} mx\n * @param {number} my\n * @returns {void}\n */\n function moveTo(mx, my) {\n if (open) {\n path.closePath();\n }\n\n path.moveTo(mx, my);\n open = true;\n }\n\n /**\n * @param {string | null | undefined} name\n * @returns {GlyphLike}\n */\n function glyphForName(name) {\n if (name) {\n for (let i = 0; i < font.numGlyphs; i++) {\n if (typeof cffFont.getGlyphName === 'function' && cffFont.getGlyphName(i) === name) {\n let g = font.getGlyph(i);\n if (!g) {\n throw new Error(`CFF glyph ${i} (name \"${name}\") is missing; font may be corrupt or incomplete`);\n }\n return g;\n }\n }\n }\n let fallback = font.getGlyph(0);\n if (!fallback) {\n throw new Error('CFF glyph 0 (.notdef) is missing; font may be corrupt or incomplete');\n }\n return fallback;\n }\n\n /**\n * @returns {void}\n */\n let parse = function () {\n while (stream.pos < end) {\n let op = stream.readUInt8();\n if (op < 32) {\n /** @type {number} */\n let index;\n /** @type {CFFCharString | undefined} */\n let subr;\n /** @type {boolean} */\n let phase;\n /** @type {number} */\n let c1x, c1y, c2x, c2y, c3x, c3y;\n /** @type {number} */\n let c4x, c4y, c5x, c5y, c6x, c6y;\n /** @type {number[]} */\n let pts;\n\n switch (op) {\n case 1: // hstem\n case 3: // vstem\n case 18: // hstemhm\n case 23: // vstemhm\n parseStems();\n break;\n\n case 4: // vmoveto\n if (stack.length > 1) {\n checkWidth();\n }\n\n y += shiftStack();\n moveTo(x, y);\n break;\n\n case 5: // rlineto\n while (stack.length >= 2) {\n x += shiftStack();\n y += shiftStack();\n path.lineTo(x, y);\n }\n break;\n\n case 6: // hlineto\n case 7: // vlineto\n phase = op === 6;\n while (stack.length >= 1) {\n if (phase) {\n x += shiftStack();\n } else {\n y += shiftStack();\n }\n\n path.lineTo(x, y);\n phase = !phase;\n }\n break;\n\n case 8: // rrcurveto\n while (stack.length > 0) {\n c1x = x + shiftStack();\n c1y = y + shiftStack();\n c2x = c1x + shiftStack();\n c2y = c1y + shiftStack();\n x = c2x + shiftStack();\n y = c2y + shiftStack();\n path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);\n }\n break;\n\n case 10: // callsubr\n index = popStack() + subrsBias;\n subr = subrs[index];\n if (subr) {\n usedSubrs[index] = true;\n let p = stream.pos;\n let e = end;\n stream.pos = subr.offset;\n end = subr.offset + subr.length;\n parse();\n stream.pos = p;\n end = e;\n }\n break;\n\n case 11: // return\n if ((cffFont.version ?? 0) >= 2) {\n break;\n }\n return;\n\n case 14: // endchar\n if ((cffFont.version ?? 0) >= 2) {\n break;\n }\n\n // Deprecated seac: [width?] adx ady bchar achar endchar (TN5177 App. C)\n if (stack.length >= 4) {\n if (stack.length > 4) {\n checkWidth();\n }\n let a = glyphForName(StandardEncoding[popStack()]);\n let b = glyphForName(StandardEncoding[popStack()]);\n let ady = popStack();\n let adx = popStack();\n let pos = stream.pos;\n path.commands = b.path.commands.concat(a.path.translate(adx, ady).commands);\n stream.pos = pos;\n open = false;\n } else if (stack.length > 0) {\n checkWidth();\n }\n\n if (open) {\n path.closePath();\n open = false;\n }\n break;\n\n case 15: { // vsindex\n if ((cffFont.version ?? 0) < 2) {\n throw new Error('vsindex operator not supported in CFF v1');\n }\n\n vsindex = popStack();\n break;\n }\n\n case 16: { // blend\n if ((cffFont.version ?? 0) < 2) {\n throw new Error('blend operator not supported in CFF v1');\n }\n\n if (!variationProcessor) {\n throw new Error('blend operator in non-variation font');\n }\n\n if (!vstore) {\n throw new Error('blend operator without variation store');\n }\n\n let blendVector = variationProcessor.getBlendVector(vstore, vsindex);\n let numBlends = popStack();\n let numOperands = numBlends * blendVector.length;\n /** @type {number} */\n let delta = stack.length - numOperands;\n /** @type {number} */\n let base = delta - numBlends;\n\n for (let i = 0; i < numBlends; i++) {\n /** @type {number} */\n let sum = stack[base + i];\n for (let j = 0; j < blendVector.length; j++) {\n sum += blendVector[j] * stack[delta++];\n }\n\n stack[base + i] = sum;\n }\n\n while (numOperands--) {\n stack.pop();\n }\n\n break;\n }\n\n case 19: // hintmask\n case 20: // cntrmask\n parseStems();\n stream.pos += (nStems + 7) >> 3;\n break;\n\n case 21: // rmoveto\n if (stack.length > 2) {\n checkWidth();\n }\n\n x += shiftStack();\n y += shiftStack();\n moveTo(x, y);\n break;\n\n case 22: // hmoveto\n if (stack.length > 1) {\n checkWidth();\n }\n\n x += shiftStack();\n moveTo(x, y);\n break;\n\n case 24: // rcurveline\n while (stack.length >= 8) {\n c1x = x + shiftStack();\n c1y = y + shiftStack();\n c2x = c1x + shiftStack();\n c2y = c1y + shiftStack();\n x = c2x + shiftStack();\n y = c2y + shiftStack();\n path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);\n }\n\n x += shiftStack();\n y += shiftStack();\n path.lineTo(x, y);\n break;\n\n case 25: // rlinecurve\n while (stack.length >= 8) {\n x += shiftStack();\n y += shiftStack();\n path.lineTo(x, y);\n }\n\n c1x = x + shiftStack();\n c1y = y + shiftStack();\n c2x = c1x + shiftStack();\n c2y = c1y + shiftStack();\n x = c2x + shiftStack();\n y = c2y + shiftStack();\n path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);\n break;\n\n case 26: // vvcurveto\n if (stack.length % 2) {\n x += shiftStack();\n }\n\n while (stack.length >= 4) {\n c1x = x;\n c1y = y + shiftStack();\n c2x = c1x + shiftStack();\n c2y = c1y + shiftStack();\n x = c2x;\n y = c2y + shiftStack();\n path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);\n }\n break;\n\n case 27: // hhcurveto\n if (stack.length % 2) {\n y += shiftStack();\n }\n\n while (stack.length >= 4) {\n c1x = x + shiftStack();\n c1y = y;\n c2x = c1x + shiftStack();\n c2y = c1y + shiftStack();\n x = c2x + shiftStack();\n y = c2y;\n path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);\n }\n break;\n\n case 28: // shortint\n stack.push(stream.readInt16BE());\n break;\n\n case 29: // callgsubr\n index = popStack() + gsubrsBias;\n {\n let candidate = Array.isArray(gsubrs) ? gsubrs[index] : gsubrs[index];\n if (isCFFCharString(candidate)) {\n subr = candidate;\n usedGsubrs[index] = true;\n let p = stream.pos;\n let e = end;\n stream.pos = subr.offset;\n end = subr.offset + subr.length;\n parse();\n stream.pos = p;\n end = e;\n }\n }\n break;\n\n case 30: // vhcurveto\n case 31: // hvcurveto\n phase = op === 31;\n while (stack.length >= 4) {\n if (phase) {\n c1x = x + shiftStack();\n c1y = y;\n c2x = c1x + shiftStack();\n c2y = c1y + shiftStack();\n y = c2y + shiftStack();\n x = c2x + (stack.length === 1 ? shiftStack() : 0);\n } else {\n c1x = x;\n c1y = y + shiftStack();\n c2x = c1x + shiftStack();\n c2y = c1y + shiftStack();\n x = c2x + shiftStack();\n y = c2y + (stack.length === 1 ? shiftStack() : 0);\n }\n\n path.bezierCurveTo(c1x, c1y, c2x, c2y, x, y);\n phase = !phase;\n }\n break;\n\n case 12: {\n op = stream.readUInt8();\n /** @type {number} */\n let a, b, val, idx;\n switch (op) {\n case 3: // and\n a = popStack();\n b = popStack();\n stack.push(a && b ? 1 : 0);\n break;\n\n case 4: // or\n a = popStack();\n b = popStack();\n stack.push(a || b ? 1 : 0);\n break;\n\n case 5: // not\n a = popStack();\n stack.push(a ? 0 : 1);\n break;\n\n case 9: // abs\n a = popStack();\n stack.push(Math.abs(a));\n break;\n\n case 10: // add\n a = popStack();\n b = popStack();\n stack.push(a + b);\n break;\n\n case 11: // sub\n a = popStack();\n b = popStack();\n stack.push(a - b);\n break;\n\n case 12: // div\n a = popStack();\n b = popStack();\n stack.push(a / b);\n break;\n\n case 14: // neg\n a = popStack();\n stack.push(-a);\n break;\n\n case 15: // eq\n a = popStack();\n b = popStack();\n stack.push(a === b ? 1 : 0);\n break;\n\n case 18: // drop\n popStack();\n break;\n\n case 20: // put\n val = popStack();\n idx = popStack();\n trans[idx] = val;\n break;\n\n case 21: // get\n idx = popStack();\n stack.push(trans[idx] || 0);\n break;\n\n case 22: { // ifelse\n let s1 = popStack();\n let s2 = popStack();\n let v1 = popStack();\n let v2 = popStack();\n stack.push(v1 <= v2 ? s1 : s2);\n break;\n }\n\n case 23: // random\n stack.push(Math.random());\n break;\n\n case 24: // mul\n a = popStack();\n b = popStack();\n stack.push(a * b);\n break;\n\n case 26: // sqrt\n a = popStack();\n stack.push(Math.sqrt(a));\n break;\n\n case 27: // dup\n a = popStack();\n stack.push(a, a);\n break;\n\n case 28: // exch\n a = popStack();\n b = popStack();\n stack.push(b, a);\n break;\n\n case 29: // index\n idx = popStack();\n if (idx < 0) {\n idx = 0;\n } else if (idx > stack.length - 1) {\n idx = stack.length - 1;\n }\n\n stack.push(stack[idx]);\n break;\n\n case 30: { // roll\n /** @type {number} */\n let n = popStack();\n /** @type {number} */\n let j = popStack();\n\n if (j >= 0) {\n while (j > 0) {\n /** @type {number} */\n let t = stack[n - 1];\n for (/** @type {number} */ let i = n - 2; i >= 0; i--) {\n stack[i + 1] = stack[i];\n }\n\n stack[0] = t;\n j--;\n }\n } else {\n while (j < 0) {\n /** @type {number} */\n let t = stack[0];\n for (/** @type {number} */ let i = 0; i <= n; i++) {\n stack[i] = stack[i + 1];\n }\n\n stack[n - 1] = t;\n j++;\n }\n }\n break;\n }\n\n case 34: // hflex\n c1x = x + shiftStack();\n c1y = y;\n c2x = c1x + shiftStack();\n c2y = c1y + shiftStack();\n c3x = c2x + shiftStack();\n c3y = c2y;\n c4x = c3x + shiftStack();\n c4y = c3y;\n c5x = c4x + shiftStack();\n c5y = c4y;\n c6x = c5x + shiftStack();\n c6y = c5y;\n x = c6x;\n y = c6y;\n\n path.bezierCurveTo(c1x, c1y, c2x, c2y, c3x, c3y);\n path.bezierCurveTo(c4x, c4y, c5x, c5y, c6x, c6y);\n break;\n\n case 35: // flex\n pts = [];\n\n for (let i = 0; i <= 5; i++) {\n x += shiftStack();\n y += shiftStack();\n pts.push(x, y);\n }\n\n path.bezierCurveTo(pts[0], pts[1], pts[2], pts[3], pts[4], pts[5]);\n path.bezierCurveTo(pts[6], pts[7], pts[8], pts[9], pts[10], pts[11]);\n shiftStack(); // fd\n break;\n\n case 36: // hflex1\n c1x = x + shiftStack();\n c1y = y + shiftStack();\n c2x = c1x + shiftStack();\n c2y = c1y + shiftStack();\n c3x = c2x + shiftStack();\n c3y = c2y;\n c4x = c3x + shiftStack();\n c4y = c3y;\n c5x = c4x + shiftStack();\n c5y = c4y + shiftStack();\n c6x = c5x + shiftStack();\n c6y = c5y;\n x = c6x;\n y = c6y;\n\n path.bezierCurveTo(c1x, c1y, c2x, c2y, c3x, c3y);\n path.bezierCurveTo(c4x, c4y, c5x, c5y, c6x, c6y);\n break;\n\n case 37: { // flex1\n let startx = x;\n let starty = y;\n\n pts = [];\n for (let i = 0; i <= 4; i++) {\n x += shiftStack();\n y += shiftStack();\n pts.push(x, y);\n }\n\n if (Math.abs(x - startx) > Math.abs(y - starty)) { // horizontal\n x += shiftStack();\n y = starty;\n } else {\n x = startx;\n y += shiftStack();\n }\n\n pts.push(x, y);\n path.bezierCurveTo(pts[0], pts[1], pts[2], pts[3], pts[4], pts[5]);\n path.bezierCurveTo(pts[6], pts[7], pts[8], pts[9], pts[10], pts[11]);\n break;\n }\n\n default:\n throw new Error(`Unknown op: 12 ${op}`);\n }\n break;\n }\n\n default:\n throw new Error(`Unknown op: ${op}`);\n }\n } else if (op < 247) {\n stack.push(op - 139);\n } else if (op < 251) {\n let b1 = stream.readUInt8();\n stack.push((op - 247) * 256 + b1 + 108);\n } else if (op < 255) {\n let b1 = stream.readUInt8();\n stack.push(-(op - 251) * 256 - b1 - 108);\n } else {\n stack.push(stream.readInt32BE() / 65536);\n }\n }\n };\n\n parse();\n\n if (open) {\n path.closePath();\n }\n\n return path;\n }\n}\n", "import TTFGlyph from './TTFGlyph';\nimport * as r from 'restructure';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('../../types/fontkit').PathRenderingContext} PathRenderingContext */\n/** @typedef {import('../../types/fontkit').SBIXImage} SBIXImageData */\n\nlet SBIXImageStruct = new r.Struct({\n originX: r.uint16,\n originY: r.uint16,\n type: new r.String(4),\n data: new r.Buffer((t) => {\n let parent = t.parent;\n let buflen = parent && typeof parent.buflen === 'number' ? parent.buflen : 0;\n let offset = typeof t._currentOffset === 'number' ? t._currentOffset : 0;\n return buflen - offset;\n })\n});\n\n/**\n * @param {StructValue} raw\n * @returns {SBIXImageData}\n */\nfunction asSBIXImage(raw) {\n let originX = raw.originX;\n let originY = raw.originY;\n let type = raw.type;\n let data = raw.data;\n if (\n typeof originX !== 'number'\n || typeof originY !== 'number'\n || typeof type !== 'string'\n || !ArrayBuffer.isView(data)\n ) {\n throw new Error('Invalid SBIX image');\n }\n return {\n originX,\n originY,\n type,\n data\n };\n}\n\n/**\n * Represents a color (e.g. emoji) glyph in Apple's SBIX format.\n */\nexport default class SBIXGlyph extends TTFGlyph {\n type = 'SBIX';\n\n /**\n * Returns an object representing a glyph image at the given point size.\n * The object has a data property with a Buffer containing the actual image data,\n * along with the image type, and origin.\n *\n * @param {number} size\n * @return {SBIXImageData | null}\n */\n getImageForSize(size) {\n let sbix = this._font.sbix;\n if (!sbix || sbix.imageTables.length === 0) {\n return null;\n }\n\n /** @type {import('../../types/fontkit').SBIXImageTable} */\n let table = sbix.imageTables[0];\n for (let i = 0; i < sbix.imageTables.length; i++) {\n table = sbix.imageTables[i];\n if (table.ppem >= size) { break; }\n }\n\n let offsets = table.imageOffsets;\n let start = offsets[this.id];\n let end = offsets[this.id + 1];\n\n if (start === end) {\n return null;\n }\n\n this._font.stream.pos = start;\n return asSBIXImage(SBIXImageStruct.decode(this._font.stream, { buflen: end - start }));\n }\n\n /**\n * @param {PathRenderingContext} ctx\n * @param {number} size\n * @returns {void}\n */\n render(ctx, size) {\n let img = this.getImageForSize(size);\n if (img != null) {\n let scale = size / this._font.unitsPerEm;\n if (typeof ctx.image === 'function') {\n ctx.image(img.data, { height: size, x: img.originX, y: (this.bbox.minY - img.originY) * scale });\n }\n }\n\n let sbix = this._font.sbix;\n if (sbix && sbix.flags.renderOutlines) {\n super.render(ctx, size);\n }\n }\n}\n", "import Glyph from './Glyph';\nimport BBox from './BBox';\n\n/** @typedef {import('../../types/fontkit').CPALColor} CPALColor */\n/** @typedef {import('../../types/fontkit').GlyphLike} GlyphLike */\n/** @typedef {import('../../types/fontkit').PathRenderingContext} PathRenderingContext */\n\nclass COLRLayer {\n /**\n * @param {GlyphLike | null | undefined} glyph\n * @param {CPALColor} color\n */\n constructor(glyph, color) {\n /** @type {GlyphLike | null | undefined} */\n this.glyph = glyph;\n /** @type {CPALColor} */\n this.color = color;\n }\n}\n\n/**\n * Represents a color (e.g. emoji) glyph in Microsoft's COLR format.\n * Each glyph in this format contain a list of colored layers, each\n * of which is another vector glyph.\n */\nexport default class COLRGlyph extends Glyph {\n type = 'COLR';\n\n /**\n * @returns {BBox}\n */\n _getBBox() {\n let layers = this.layers;\n if (!layers) {\n let g = this._font._getBaseGlyph(this.id);\n return g ? new BBox(g.bbox.minX, g.bbox.minY, g.bbox.maxX, g.bbox.maxY) : new BBox(0, 0, 0, 0);\n }\n\n let bbox = new BBox();\n for (let i = 0; i < layers.length; i++) {\n let layer = layers[i];\n if (!layer.glyph) {\n continue;\n }\n let b = layer.glyph.bbox;\n bbox.addPoint(b.minX, b.minY);\n bbox.addPoint(b.maxX, b.maxY);\n }\n\n return bbox;\n }\n\n /**\n * Returns an array of objects containing the glyph and color for\n * each layer in the composite color glyph.\n * @type {COLRLayer[] | null}\n */\n get layers() {\n let cpal = this._font.CPAL;\n let colr = this._font.COLR;\n\n // COLR v1 uses paint-based records instead of v0 baseGlyphRecord\n if (!colr || !colr.baseGlyphRecord) {\n return null;\n }\n\n let low = 0;\n let high = colr.baseGlyphRecord.length - 1;\n /** @type {import('../../types/fontkit').COLRBaseGlyphRecord | undefined} */\n let baseLayer;\n\n while (low <= high) {\n let mid = (low + high) >> 1;\n let rec = colr.baseGlyphRecord[mid];\n\n if (this.id < rec.gid) {\n high = mid - 1;\n } else if (this.id > rec.gid) {\n low = mid + 1;\n } else {\n baseLayer = rec;\n break;\n }\n }\n\n // if base glyph not found in COLR table,\n // default to normal glyph from glyf or CFF\n if (baseLayer == null) {\n let g = this._font._getBaseGlyph(this.id);\n /** @type {CPALColor} */\n let color = {\n red: 0,\n green: 0,\n blue: 0,\n alpha: 255\n };\n\n return [new COLRLayer(g, color)];\n }\n\n // otherwise, return an array of all the layers\n /** @type {COLRLayer[]} */\n let layers = [];\n for (let i = baseLayer.firstLayerIndex; i < baseLayer.firstLayerIndex + baseLayer.numLayers; i++) {\n let rec = colr.layerRecords[i];\n if (!cpal || !rec) {\n continue;\n }\n let color = cpal.colorRecords[rec.paletteIndex];\n if (!color) {\n continue;\n }\n let g = this._font._getBaseGlyph(rec.gid);\n layers.push(new COLRLayer(g, color));\n }\n\n return layers;\n }\n\n /**\n * @param {PathRenderingContext} ctx\n * @param {number} size\n * @returns {void}\n */\n render(ctx, size) {\n let layers = this.layers;\n if (!layers) {\n return;\n }\n\n for (let { glyph, color } of layers) {\n if (!glyph) {\n continue;\n }\n if (typeof ctx.fillColor === 'function') {\n ctx.fillColor([color.red, color.green, color.blue], color.alpha / 255 * 100);\n }\n glyph.render(ctx, size);\n }\n\n return;\n }\n}\n", "import Glyph from './Glyph';\n\n/**\n * Bitmap glyph in CBDT/CBLC format (e.g. color emoji). No vector outline;\n * metrics come from hmtx via Glyph._getMetrics().\n */\nexport default class CBDTGlyph extends Glyph {\n type = 'CBDT';\n}\n", "/** @typedef {import('../../types/fontkit').FontLike} FontLike */\n/** @typedef {import('../../types/fontkit').GlyphPoint} GlyphPoint */\n/** @typedef {import('../../types/fontkit').HVARTable} HVARTable */\n/** @typedef {import('../../types/fontkit').ItemVariationStore} ItemVariationStore */\n/** @typedef {import('../../types/fontkit').ItemVariationData} ItemVariationData */\n\nconst TUPLES_SHARE_POINT_NUMBERS = 0x8000;\nconst TUPLE_COUNT_MASK = 0x0fff;\nconst EMBEDDED_TUPLE_COORD = 0x8000;\nconst INTERMEDIATE_TUPLE = 0x4000;\nconst PRIVATE_POINT_NUMBERS = 0x2000;\nconst TUPLE_INDEX_MASK = 0x0fff;\nconst POINTS_ARE_WORDS = 0x80;\nconst POINT_RUN_COUNT_MASK = 0x7f;\nconst DELTAS_ARE_ZERO = 0x80;\nconst DELTAS_ARE_WORDS = 0x40;\nconst DELTA_RUN_COUNT_MASK = 0x3f;\n\n/**\n * This class is transforms TrueType glyphs according to the data from\n * the Apple Advanced Typography variation tables (fvar, gvar, and avar).\n * These tables allow infinite adjustments to glyph weight, width, slant,\n * and optical size without the designer needing to specify every exact style.\n *\n * Apple's documentation for these tables is not great, so thanks to the\n * Freetype project for figuring much of this out.\n *\n * @private\n */\nexport default class GlyphVariationProcessor {\n /**\n * @param {FontLike} font\n * @param {number[]} coords\n */\n constructor(font, coords) {\n /** @type {FontLike} */\n this.font = font;\n /** @type {number[]} */\n this.normalizedCoords = this.normalizeCoords(coords);\n /** @type {Map<ItemVariationData, number[]>} */\n this.blendVectors = new Map();\n }\n\n /**\n * @param {number[]} coords\n * @returns {number[]}\n */\n normalizeCoords(coords) {\n // the default mapping is linear along each axis, in two segments:\n // from the minValue to defaultValue, and from defaultValue to maxValue.\n /** @type {number[]} */\n let normalized = [];\n let fvar = this.font.fvar;\n if (!fvar) {\n return normalized;\n }\n\n for (let i = 0; i < fvar.axis.length; i++) {\n let axis = fvar.axis[i];\n if (coords[i] < axis.defaultValue) {\n normalized.push((coords[i] - axis.defaultValue + Number.EPSILON) / (axis.defaultValue - axis.minValue + Number.EPSILON));\n } else {\n normalized.push((coords[i] - axis.defaultValue + Number.EPSILON) / (axis.maxValue - axis.defaultValue + Number.EPSILON));\n }\n }\n\n // if there is an avar table, the normalized value is calculated\n // by interpolating between the two nearest mapped values.\n if (this.font.avar) {\n for (let i = 0; i < this.font.avar.segment.length; i++) {\n let segment = this.font.avar.segment[i];\n for (let j = 0; j < segment.correspondence.length; j++) {\n let pair = segment.correspondence[j];\n if (j >= 1 && normalized[i] < pair.fromCoord) {\n let prev = segment.correspondence[j - 1];\n normalized[i] = ((normalized[i] - prev.fromCoord) * (pair.toCoord - prev.toCoord) + Number.EPSILON)\n / (pair.fromCoord - prev.fromCoord + Number.EPSILON)\n + prev.toCoord;\n\n break;\n }\n }\n }\n }\n\n return normalized;\n }\n\n /**\n * @param {number} gid\n * @param {GlyphPoint[]} glyphPoints\n * @returns {void}\n */\n transformPoints(gid, glyphPoints) {\n if (!this.font.fvar || !this.font.gvar) { return; }\n\n let { gvar } = this.font;\n if (gid >= gvar.glyphCount) { return; }\n\n let offset = gvar.offsets[gid];\n if (offset === gvar.offsets[gid + 1]) { return; }\n\n // Read the gvar data for this glyph\n let { stream } = this.font;\n stream.pos = offset;\n if (stream.pos >= stream.length) {\n return;\n }\n\n let tupleCount = stream.readUInt16BE();\n let offsetToData = offset + stream.readUInt16BE();\n\n /** @type {Uint16Array} */\n let sharedPoints = new Uint16Array(0);\n if (tupleCount & TUPLES_SHARE_POINT_NUMBERS) {\n let here = stream.pos;\n stream.pos = offsetToData;\n sharedPoints = this.decodePoints();\n offsetToData = stream.pos;\n stream.pos = here;\n }\n\n let origPoints = glyphPoints.map(pt => pt.copy());\n\n tupleCount &= TUPLE_COUNT_MASK;\n for (let i = 0; i < tupleCount; i++) {\n let tupleDataSize = stream.readUInt16BE();\n let tupleIndex = stream.readUInt16BE();\n\n /** @type {number[]} */\n let tupleCoords;\n if (tupleIndex & EMBEDDED_TUPLE_COORD) {\n tupleCoords = [];\n for (let a = 0; a < gvar.axisCount; a++) {\n tupleCoords.push(stream.readInt16BE() / 16384);\n }\n } else {\n if ((tupleIndex & TUPLE_INDEX_MASK) >= gvar.globalCoordCount) {\n throw new Error('Invalid gvar table');\n }\n\n tupleCoords = gvar.globalCoords[tupleIndex & TUPLE_INDEX_MASK];\n }\n\n /** @type {number[] | undefined} */\n let startCoords;\n /** @type {number[] | undefined} */\n let endCoords;\n if (tupleIndex & INTERMEDIATE_TUPLE) {\n startCoords = [];\n for (let a = 0; a < gvar.axisCount; a++) {\n startCoords.push(stream.readInt16BE() / 16384);\n }\n\n endCoords = [];\n for (let a = 0; a < gvar.axisCount; a++) {\n endCoords.push(stream.readInt16BE() / 16384);\n }\n }\n\n // Get the factor at which to apply this tuple\n let factor = this.tupleFactor(tupleIndex, tupleCoords, startCoords, endCoords);\n if (factor === 0) {\n offsetToData += tupleDataSize;\n continue;\n }\n\n let here = stream.pos;\n stream.pos = offsetToData;\n\n /** @type {Uint16Array} */\n let points;\n if (tupleIndex & PRIVATE_POINT_NUMBERS) {\n points = this.decodePoints();\n } else {\n points = sharedPoints;\n }\n\n // points.length = 0 means there are deltas for all points\n let nPoints = points.length === 0 ? glyphPoints.length : points.length;\n let xDeltas = this.decodeDeltas(nPoints);\n let yDeltas = this.decodeDeltas(nPoints);\n\n if (points.length === 0) { // all points\n for (let pi = 0; pi < glyphPoints.length; pi++) {\n let point = glyphPoints[pi];\n point.x += Math.round(xDeltas[pi] * factor);\n point.y += Math.round(yDeltas[pi] * factor);\n }\n } else {\n let outPoints = origPoints.map(pt => pt.copy());\n let hasDelta = glyphPoints.map(() => false);\n\n for (let pi = 0; pi < points.length; pi++) {\n let idx = points[pi];\n if (idx < glyphPoints.length) {\n let point = outPoints[idx];\n hasDelta[idx] = true;\n\n point.x += xDeltas[pi] * factor;\n point.y += yDeltas[pi] * factor;\n }\n }\n\n this.interpolateMissingDeltas(outPoints, origPoints, hasDelta);\n\n for (let pi = 0; pi < glyphPoints.length; pi++) {\n let deltaX = outPoints[pi].x - origPoints[pi].x;\n let deltaY = outPoints[pi].y - origPoints[pi].y;\n\n glyphPoints[pi].x = Math.round(glyphPoints[pi].x + deltaX);\n glyphPoints[pi].y = Math.round(glyphPoints[pi].y + deltaY);\n }\n }\n\n offsetToData += tupleDataSize;\n stream.pos = here;\n }\n }\n\n /**\n * @returns {Uint16Array}\n */\n decodePoints() {\n let stream = this.font.stream;\n let count = stream.readUInt8();\n\n if (count & POINTS_ARE_WORDS) {\n count = (count & POINT_RUN_COUNT_MASK) << 8 | stream.readUInt8();\n }\n\n let points = new Uint16Array(count);\n let i = 0;\n let point = 0;\n while (i < count) {\n let run = stream.readUInt8();\n let runCount = (run & POINT_RUN_COUNT_MASK) + 1;\n // gvar point numbers are big-endian (OpenType); was incorrectly readUInt16.\n let fn = run & POINTS_ARE_WORDS ? stream.readUInt16BE : stream.readUInt8;\n\n for (let j = 0; j < runCount && i < count; j++) {\n point += fn.call(stream);\n points[i++] = point;\n }\n }\n\n return points;\n }\n\n /**\n * @param {number} count\n * @returns {Int16Array}\n */\n decodeDeltas(count) {\n let stream = this.font.stream;\n let i = 0;\n let deltas = new Int16Array(count);\n\n while (i < count) {\n let run = stream.readUInt8();\n let runCount = (run & DELTA_RUN_COUNT_MASK) + 1;\n\n if (run & DELTAS_ARE_ZERO) {\n i += runCount;\n } else {\n let fn = run & DELTAS_ARE_WORDS ? stream.readInt16BE : stream.readInt8;\n for (let j = 0; j < runCount && i < count; j++) {\n deltas[i++] = fn.call(stream);\n }\n }\n }\n\n return deltas;\n }\n\n /**\n * @param {number} tupleIndex\n * @param {number[]} tupleCoords\n * @param {number[] | undefined} startCoords\n * @param {number[] | undefined} endCoords\n * @returns {number}\n */\n tupleFactor(tupleIndex, tupleCoords, startCoords, endCoords) {\n let normalized = this.normalizedCoords;\n let { gvar } = this.font;\n if (!gvar) {\n return 0;\n }\n let factor = 1;\n\n for (let i = 0; i < gvar.axisCount; i++) {\n if (tupleCoords[i] === 0) {\n continue;\n }\n\n if (normalized[i] === 0) {\n return 0;\n }\n\n if ((tupleIndex & INTERMEDIATE_TUPLE) === 0) {\n if ((normalized[i] < Math.min(0, tupleCoords[i]))\n || (normalized[i] > Math.max(0, tupleCoords[i]))) {\n return 0;\n }\n\n factor = (factor * normalized[i] + Number.EPSILON) / (tupleCoords[i] + Number.EPSILON);\n } else {\n if (!startCoords || !endCoords) {\n return 0;\n }\n if ((normalized[i] < startCoords[i])\n || (normalized[i] > endCoords[i])) {\n return 0;\n } else if (normalized[i] < tupleCoords[i]) {\n factor = factor * (normalized[i] - startCoords[i] + Number.EPSILON) / (tupleCoords[i] - startCoords[i] + Number.EPSILON);\n } else {\n factor = factor * (endCoords[i] - normalized[i] + Number.EPSILON) / (endCoords[i] - tupleCoords[i] + Number.EPSILON);\n }\n }\n }\n\n return factor;\n }\n\n /**\n * Interpolates points without delta values.\n * Needed for the \u00D8 and Q glyphs in Skia.\n * Algorithm from Freetype.\n * @param {GlyphPoint[]} points\n * @param {GlyphPoint[]} inPoints\n * @param {boolean[]} hasDelta\n * @returns {void}\n */\n interpolateMissingDeltas(points, inPoints, hasDelta) {\n if (points.length === 0) {\n return;\n }\n\n let point = 0;\n while (point < points.length) {\n let firstPoint = point;\n\n // find the end point of the contour\n let endPoint = point;\n let pt = points[endPoint];\n while (!pt.endContour) {\n pt = points[++endPoint];\n }\n\n // find the first point that has a delta\n while (point <= endPoint && !hasDelta[point]) {\n point++;\n }\n\n if (point > endPoint) {\n continue;\n }\n\n let firstDelta = point;\n let curDelta = point;\n point++;\n\n while (point <= endPoint) {\n // find the next point with a delta, and interpolate intermediate points\n if (hasDelta[point]) {\n this.deltaInterpolate(curDelta + 1, point - 1, curDelta, point, inPoints, points);\n curDelta = point;\n }\n\n point++;\n }\n\n // shift contour if we only have a single delta\n if (curDelta === firstDelta) {\n this.deltaShift(firstPoint, endPoint, curDelta, inPoints, points);\n } else {\n // otherwise, handle the remaining points at the end and beginning of the contour\n this.deltaInterpolate(curDelta + 1, endPoint, curDelta, firstDelta, inPoints, points);\n\n if (firstDelta > 0) {\n this.deltaInterpolate(firstPoint, firstDelta - 1, curDelta, firstDelta, inPoints, points);\n }\n }\n\n point = endPoint + 1;\n }\n }\n\n /**\n * @param {number} p1\n * @param {number} p2\n * @param {number} ref1\n * @param {number} ref2\n * @param {GlyphPoint[]} inPoints\n * @param {GlyphPoint[]} outPoints\n * @returns {void}\n */\n deltaInterpolate(p1, p2, ref1, ref2, inPoints, outPoints) {\n if (p1 > p2) {\n return;\n }\n\n /** @type {Array<'x' | 'y'>} */\n let iterable = ['x', 'y'];\n for (let i = 0; i < iterable.length; i++) {\n let k = iterable[i];\n let r1 = ref1;\n let r2 = ref2;\n if (inPoints[r1][k] > inPoints[r2][k]) {\n let p = r1;\n r1 = r2;\n r2 = p;\n }\n\n let in1 = inPoints[r1][k];\n let in2 = inPoints[r2][k];\n let out1 = outPoints[r1][k];\n let out2 = outPoints[r2][k];\n\n // If the reference points have the same coordinate but different\n // delta, inferred delta is zero. Otherwise interpolate.\n if (in1 !== in2 || out1 === out2) {\n let scale = in1 === in2 ? 0 : (out2 - out1) / (in2 - in1);\n\n for (let p = p1; p <= p2; p++) {\n let out = inPoints[p][k];\n\n if (out <= in1) {\n out += out1 - in1;\n } else if (out >= in2) {\n out += out2 - in2;\n } else {\n out = out1 + (out - in1) * scale;\n }\n\n outPoints[p][k] = out;\n }\n }\n }\n }\n\n /**\n * @param {number} p1\n * @param {number} p2\n * @param {number} ref\n * @param {GlyphPoint[]} inPoints\n * @param {GlyphPoint[]} outPoints\n * @returns {void}\n */\n deltaShift(p1, p2, ref, inPoints, outPoints) {\n let deltaX = outPoints[ref].x - inPoints[ref].x;\n let deltaY = outPoints[ref].y - inPoints[ref].y;\n\n if (deltaX === 0 && deltaY === 0) {\n return;\n }\n\n for (let p = p1; p <= p2; p++) {\n if (p !== ref) {\n outPoints[p].x += deltaX;\n outPoints[p].y += deltaY;\n }\n }\n }\n\n /**\n * @param {number} gid\n * @param {HVARTable} table\n * @returns {number}\n */\n getAdvanceAdjustment(gid, table) {\n let outerIndex, innerIndex;\n\n if (table.advanceWidthMapping) {\n let idx = gid;\n if (idx >= table.advanceWidthMapping.mapCount) {\n idx = table.advanceWidthMapping.mapCount - 1;\n }\n\n ({ outerIndex, innerIndex } = table.advanceWidthMapping.mapData[idx]);\n } else {\n outerIndex = 0;\n innerIndex = gid;\n }\n\n return this.getDelta(table.itemVariationStore, outerIndex, innerIndex);\n }\n\n /**\n * See pseudo code from `Font Variations Overview'\n * in the OpenType specification.\n * @param {ItemVariationStore} itemStore\n * @param {number} outerIndex\n * @param {number} innerIndex\n * @returns {number}\n */\n getDelta(itemStore, outerIndex, innerIndex) {\n if (outerIndex >= itemStore.itemVariationData.length) {\n return 0;\n }\n\n let varData = itemStore.itemVariationData[outerIndex];\n if (innerIndex >= varData.deltaSets.length) {\n return 0;\n }\n\n let deltaSet = varData.deltaSets[innerIndex];\n let blendVector = this.getBlendVector(itemStore, outerIndex);\n let netAdjustment = 0;\n\n for (let master = 0; master < varData.regionIndexCount; master++) {\n netAdjustment += deltaSet.deltas[master] * blendVector[master];\n }\n\n return netAdjustment;\n }\n\n /**\n * @param {ItemVariationStore} itemStore\n * @param {number} outerIndex\n * @returns {number[]}\n */\n getBlendVector(itemStore, outerIndex) {\n let varData = itemStore.itemVariationData[outerIndex];\n let cached = this.blendVectors.get(varData);\n if (cached) {\n return cached;\n }\n\n let normalizedCoords = this.normalizedCoords;\n /** @type {number[]} */\n let blendVector = [];\n\n // outer loop steps through master designs to be blended\n for (let master = 0; master < varData.regionIndexCount; master++) {\n let scalar = 1;\n let regionIndex = varData.regionIndexes[master];\n let axes = itemStore.variationRegionList.variationRegions[regionIndex];\n\n // inner loop steps through axes in this region\n for (let j = 0; j < axes.length; j++) {\n let axis = axes[j];\n let axisScalar;\n\n // compute the scalar contribution of this axis\n // ignore invalid ranges\n if (axis.startCoord > axis.peakCoord || axis.peakCoord > axis.endCoord) {\n axisScalar = 1;\n } else if (axis.startCoord < 0 && axis.endCoord > 0 && axis.peakCoord !== 0) {\n axisScalar = 1;\n\n // peak of 0 means ignore this axis\n } else if (axis.peakCoord === 0) {\n axisScalar = 1;\n\n // ignore this region if coords are out of range\n } else if (normalizedCoords[j] < axis.startCoord || normalizedCoords[j] > axis.endCoord) {\n axisScalar = 0;\n\n // calculate a proportional factor\n } else {\n if (normalizedCoords[j] === axis.peakCoord) {\n axisScalar = 1;\n } else if (normalizedCoords[j] < axis.peakCoord) {\n axisScalar = (normalizedCoords[j] - axis.startCoord + Number.EPSILON)\n / (axis.peakCoord - axis.startCoord + Number.EPSILON);\n } else {\n axisScalar = (axis.endCoord - normalizedCoords[j] + Number.EPSILON)\n / (axis.endCoord - axis.peakCoord + Number.EPSILON);\n }\n }\n\n // take product of all the axis scalars\n scalar *= axisScalar;\n }\n\n blendVector[master] = scalar;\n }\n\n this.blendVectors.set(varData, blendVector);\n return blendVector;\n }\n}\n", "import cloneDeep from 'clone';\nimport Subset from './Subset';\nimport Directory from '../tables/directory';\nimport TTFGlyphEncoder from '../glyph/TTFGlyphEncoder';\n\n/** @typedef {import('../../types/fontkit').SubsetFont} SubsetFont */\n/** @typedef {import('../../types/fontkit').DecodedGlyf} DecodedGlyf */\n/** @typedef {import('restructure').BinaryBuffer} BinaryBuffer */\n/** @typedef {import('restructure').StructValue} StructValue */\n\n/**\n * @typedef {{ advance: number, bearing: number }} HmtxMetric\n */\n\nexport default class TTFSubset extends Subset {\n /** @type {TTFGlyphEncoder} */\n glyphEncoder;\n /** @type {Uint8Array[] | null} */\n glyf = null;\n /** @type {number} */\n offset = 0;\n /** @type {{ offsets: number[], version: number } | null} */\n loca = null;\n /** @type {{ metrics: HmtxMetric[], bearings: number[] } | null} */\n hmtx = null;\n\n /**\n * @param {SubsetFont} font\n */\n constructor(font) {\n super(font);\n this.glyphEncoder = new TTFGlyphEncoder();\n }\n\n /**\n * @param {number} gid\n * @returns {number}\n */\n _addGlyph(gid) {\n let glyph = this.font.getGlyph(gid);\n if (!glyph || !glyph._decode) {\n throw new Error(`Cannot decode glyph ${gid}`);\n }\n let glyf = glyph._decode();\n\n if (!this.font.loca) {\n throw new Error('Font missing loca table');\n }\n\n // get the offset to the glyph from the loca table\n let curOffset = this.font.loca.offsets[gid];\n let nextOffset = this.font.loca.offsets[gid + 1];\n\n let stream = this.font._getTableStream('glyf');\n if (!stream) {\n throw new Error('Font missing glyf table');\n }\n stream.pos += curOffset;\n\n let raw = stream.readBuffer(nextOffset - curOffset);\n /** @type {Uint8Array} */\n let buffer = raw instanceof Uint8Array\n ? raw\n : Uint8Array.from(/** @type {Iterable<number>} */ (/** @type {unknown} */ (raw)));\n\n // if it is a compound glyph, include its components\n if (glyf && glyf.numberOfContours < 0) {\n buffer = new Uint8Array(buffer);\n let ab = buffer.buffer instanceof ArrayBuffer ? buffer.buffer : new Uint8Array(buffer).buffer;\n let view = new DataView(ab, buffer.byteOffset, buffer.byteLength);\n for (let component of glyf.components || []) {\n gid = this.includeGlyph(component.glyphID);\n view.setUint16(component.pos, gid);\n }\n } else if (glyf && this.font._variationProcessor) {\n // If this is a TrueType variation glyph, re-encode the path\n let encoded = this.glyphEncoder.encodeSimple(\n /** @type {import('../glyph/Path').default} */ (/** @type {unknown} */ (glyph.path)),\n glyf.instructions\n );\n buffer = encoded instanceof Uint8Array\n ? encoded\n : Uint8Array.from(/** @type {Iterable<number>} */ (/** @type {unknown} */ (encoded)));\n }\n\n if (!this.glyf || !this.loca || !this.hmtx) {\n throw new Error('TTFSubset.encode must initialize glyf/loca/hmtx before _addGlyph');\n }\n\n this.glyf.push(buffer);\n this.loca.offsets.push(this.offset);\n\n this.hmtx.metrics.push({\n advance: glyph.advanceWidth,\n bearing: glyph._getMetrics().leftBearing\n });\n\n this.offset += buffer.byteLength;\n return this.glyf.length - 1;\n }\n\n /**\n * @returns {BinaryBuffer}\n */\n encode() {\n // tables required by PDF spec:\n // head, hhea, loca, maxp, cvt , prep, glyf, hmtx, fpgm\n //\n // additional tables required for standalone fonts:\n // name, cmap, OS/2, post\n\n /** @type {Uint8Array[]} */\n this.glyf = [];\n this.offset = 0;\n this.loca = {\n offsets: /** @type {number[]} */ ([]),\n version: this.font.loca ? (this.font.loca.version ?? 0) : 0\n };\n\n this.hmtx = {\n metrics: /** @type {HmtxMetric[]} */ ([]),\n bearings: /** @type {number[]} */ ([])\n };\n\n // include all the glyphs\n // not using a for loop because we need to support adding more\n // glyphs to the array as we go, and CoffeeScript caches the length.\n let i = 0;\n while (i < this.glyphs.length) {\n this._addGlyph(this.glyphs[i++]);\n }\n\n let maxp = cloneDeep(this.font.maxp);\n if (maxp && typeof maxp === 'object') {\n /** @type {StructValue} */ (maxp).numGlyphs = this.glyf.length;\n }\n\n let loca = this.loca;\n loca.offsets.push(this.offset);\n\n let head = cloneDeep(this.font.head);\n if (head && typeof head === 'object') {\n /** @type {StructValue} */ (head).indexToLocFormat = loca.version;\n }\n\n let hhea = cloneDeep(this.font.hhea);\n if (hhea && typeof hhea === 'object') {\n /** @type {StructValue} */ (hhea).numberOfMetrics = this.hmtx.metrics.length;\n }\n\n // TODO: subset prep, cvt, fpgm?\n // The following is the minimum set of tables.\n /** @type {Record<string, unknown>} */\n let t = {\n head,\n hhea,\n loca: this.loca,\n maxp,\n 'cvt ': this.font['cvt '],\n prep: this.font.prep,\n glyf: this.glyf,\n hmtx: this.hmtx,\n fpgm: this.font.fpgm\n };\n\n let fontTables = /** @type {Record<string, unknown>} */ (/** @type {unknown} */ (this.font));\n for (const tag of this.includedTables) {\n t[tag] = cloneDeep(fontTables[tag]);\n }\n\n return Directory.toBuffer({ tables: t });\n }\n}\n", "import Tables from '../tables';\n\n/** @typedef {import('../../types/fontkit').SubsetFont} SubsetFont */\n/** @typedef {import('../../types/fontkit').SubsetGlyph} SubsetGlyph */\n/** @typedef {import('../../types/fontkit').TableCodec} TableCodec */\n\n// Tables written by TTFSubset.encode; must not be overwritten via includeTable.\nconst MANAGED_TTF_TABLES = [\n 'head', 'hhea', 'loca', 'maxp', 'cvt ', 'prep', 'glyf', 'hmtx', 'fpgm'\n];\n\nexport default class Subset {\n /**\n * @param {SubsetFont} font\n */\n constructor(font) {\n /** @type {SubsetFont} */\n this.font = font;\n /** @type {number[]} */\n this.glyphs = [];\n /** @type {Record<number, number>} */\n this.mapping = {};\n // Extra OT table tags to copy into a TTF subset (e.g. 'OS/2', 'name', 'post').\n /** @type {string[]} */\n this.includedTables = [];\n\n // always include the missing glyph\n this.includeGlyph(0);\n }\n\n /**\n * @param {number | SubsetGlyph} glyph\n * @returns {number}\n */\n includeGlyph(glyph) {\n if (typeof glyph === 'object') {\n glyph = glyph.id;\n }\n\n if (this.mapping[glyph] == null) {\n this.glyphs.push(glyph);\n this.mapping[glyph] = this.glyphs.length - 1;\n }\n\n return this.mapping[glyph];\n }\n\n // Copy an OT table into the TTF subset (tag is a 4-byte string, e.g. 'OS/2').\n // Only honored by TTFSubset.encode; CFFSubset overrides this to throw.\n /**\n * @param {string} [tag]\n * @returns {this}\n */\n includeTable(tag) {\n if (typeof tag !== 'string' || tag.length !== 4) {\n throw new Error(\n `Invalid OpenType table tag ${JSON.stringify(tag)}: tags must be 4 characters `\n + `(pad with spaces if needed, e.g. \"cvt \").`\n );\n }\n\n if (MANAGED_TTF_TABLES.includes(tag)) {\n throw new Error(\n `Table \"${tag}\" is already managed by the TrueType subsetter and cannot be included explicitly.`\n );\n }\n\n if (!this.font.directory.tables[tag]) {\n throw new Error(`Table \"${tag}\" is not present in this font.`);\n }\n\n let encoders = /** @type {Record<string, TableCodec | undefined>} */ (/** @type {unknown} */ (Tables));\n if (!encoders[tag]) {\n throw new Error(`Table \"${tag}\" cannot be encoded (no encoder registered in fontkit).`);\n }\n\n if (!this.includedTables.includes(tag)) {\n this.includedTables.push(tag);\n }\n\n return this;\n }\n}\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').EncodeStream} EncodeStream */\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('./Path').default} Path */\n\n// Flags for simple glyphs\nconst ON_CURVE = 1 << 0;\nconst X_SHORT_VECTOR = 1 << 1;\nconst Y_SHORT_VECTOR = 1 << 2;\nconst REPEAT = 1 << 3;\nconst SAME_X = 1 << 4;\nconst SAME_Y = 1 << 5;\n\nclass Point {\n /**\n * @param {number} val\n * @returns {number}\n */\n static size(val) {\n return val >= 0 && val <= 255 ? 1 : 2;\n }\n\n /**\n * @param {EncodeStream} stream\n * @param {number} value\n * @returns {void}\n */\n static encode(stream, value) {\n if (value >= 0 && value <= 255) {\n stream.writeUInt8(value);\n } else {\n stream.writeInt16BE(value);\n }\n }\n}\n\nlet Glyf = new r.Struct({\n numberOfContours: r.int16, // if negative, this is a composite glyph\n xMin: r.int16,\n yMin: r.int16,\n xMax: r.int16,\n yMax: r.int16,\n endPtsOfContours: new r.Array(r.uint16, 'numberOfContours'),\n instructions: new r.Array(r.uint8, r.uint16),\n flags: new r.Array(r.uint8, 0),\n xPoints: new r.Array(Point, 0),\n yPoints: new r.Array(Point, 0)\n});\n\n/**\n * Encodes TrueType glyph outlines\n */\nexport default class TTFGlyphEncoder {\n /**\n * @param {Path} path\n * @param {number[]} [instructions]\n * @returns {import('restructure').BinaryBuffer}\n */\n encodeSimple(path, instructions = []) {\n /** @type {number[]} */\n let endPtsOfContours = [];\n /** @type {number[]} */\n let xPoints = [];\n /** @type {number[]} */\n let yPoints = [];\n /** @type {number[]} */\n let flags = [];\n let same = 0;\n let lastX = 0, lastY = 0, lastFlag = 0;\n let pointCount = 0;\n\n for (let i = 0; i < path.commands.length; i++) {\n let c = path.commands[i];\n\n for (let j = 0; j < c.args.length; j += 2) {\n let x = c.args[j];\n let y = c.args[j + 1];\n let flag = 0;\n\n // If the ending point of a quadratic curve is the midpoint\n // between the control point and the control point of the next\n // quadratic curve, we can omit the ending point.\n if (c.command === 'quadraticCurveTo' && j === 2) {\n let next = path.commands[i + 1];\n if (next && next.command === 'quadraticCurveTo') {\n let midX = (lastX + next.args[0]) / 2;\n let midY = (lastY + next.args[1]) / 2;\n\n if (x === midX && y === midY) {\n continue;\n }\n }\n }\n\n // All points except control points are on curve.\n if (!(c.command === 'quadraticCurveTo' && j === 0)) {\n flag |= ON_CURVE;\n }\n\n flag = this._encodePoint(x, lastX, xPoints, flag, X_SHORT_VECTOR, SAME_X);\n flag = this._encodePoint(y, lastY, yPoints, flag, Y_SHORT_VECTOR, SAME_Y);\n\n if (flag === lastFlag && same < 255) {\n flags[flags.length - 1] |= REPEAT;\n same++;\n } else {\n if (same > 0) {\n flags.push(same);\n same = 0;\n }\n\n flags.push(flag);\n lastFlag = flag;\n }\n\n lastX = x;\n lastY = y;\n pointCount++;\n }\n\n if (c.command === 'closePath') {\n endPtsOfContours.push(pointCount - 1);\n }\n }\n\n // Close the path if the last command didn't already\n if (path.commands.length > 1 && path.commands[path.commands.length - 1].command !== 'closePath') {\n endPtsOfContours.push(pointCount - 1);\n }\n\n let bbox = path.bbox;\n /** @type {StructValue} */\n let glyf = {\n numberOfContours: endPtsOfContours.length,\n xMin: bbox.minX,\n yMin: bbox.minY,\n xMax: bbox.maxX,\n yMax: bbox.maxY,\n endPtsOfContours: endPtsOfContours,\n instructions: instructions,\n flags: flags,\n xPoints: xPoints,\n yPoints: yPoints\n };\n\n let size = Glyf.size(glyf);\n let tail = 4 - (size % 4);\n\n let stream = new r.EncodeStream(size + tail);\n Glyf.encode(stream, glyf);\n\n // Align to 4-byte length\n if (tail !== 0) {\n stream.fill(0, tail);\n }\n\n return stream.buffer;\n }\n\n /**\n * @param {number} value\n * @param {number} last\n * @param {number[]} points\n * @param {number} flag\n * @param {number} shortFlag\n * @param {number} sameFlag\n * @returns {number}\n */\n _encodePoint(value, last, points, flag, shortFlag, sameFlag) {\n let diff = value - last;\n\n if (value === last) {\n flag |= sameFlag;\n } else {\n if (-255 <= diff && diff <= 255) {\n flag |= shortFlag;\n if (diff < 0) {\n diff = -diff;\n } else {\n flag |= sameFlag;\n }\n }\n\n points.push(diff);\n }\n\n return flag;\n }\n}\n", "import Subset from './Subset';\nimport CFFTop from '../cff/CFFTop';\nimport standardStrings from '../cff/CFFStandardStrings';\n\n/** @typedef {import('../../types/fontkit').SubsetFont} SubsetFont */\n/** @typedef {import('../../types/fontkit').CFFFontLike} CFFFontLike */\n/** @typedef {import('../../types/fontkit').CFFTopDict} CFFTopDict */\n/** @typedef {import('../../types/fontkit').CFFCharString} CFFCharString */\n/** @typedef {import('restructure').BinaryBuffer} BinaryBuffer */\n/** @typedef {import('restructure').StructValue} StructValue */\n\nexport default class CFFSubset extends Subset {\n /** @type {CFFFontLike} */\n cff;\n /** @type {BinaryBuffer[] | null} */\n charstrings = null;\n /** @type {BinaryBuffer[] | null} */\n gsubrs = null;\n /** @type {string[] | null} */\n strings = null;\n\n /**\n * @param {SubsetFont} font\n */\n constructor(font) {\n super(font);\n\n let cff = this.font['CFF '];\n if (!cff) {\n throw new Error('Not a CFF Font');\n }\n this.cff = cff;\n }\n\n /**\n * @param {string} [_tag]\n * @returns {never}\n */\n includeTable(_tag) {\n throw new Error('includeTable is only supported for TrueType (glyf) subsets, not CFF.');\n }\n\n /**\n * @returns {void}\n */\n subsetCharstrings() {\n this.charstrings = [];\n /** @type {Record<string, boolean>} */\n let gsubrs = {};\n\n for (let gid of this.glyphs) {\n if (!this.cff.getCharString) {\n throw new Error('CFF font missing getCharString()');\n }\n this.charstrings.push(this.cff.getCharString(gid));\n\n let glyph = this.font.getGlyph(gid);\n if (!glyph) {\n continue;\n }\n void glyph.path; // this causes the glyph to be parsed\n\n if (glyph._usedGsubrs) {\n for (let subr in glyph._usedGsubrs) {\n gsubrs[subr] = true;\n }\n }\n }\n\n this.gsubrs = this.subsetSubrs(\n /** @type {Array<{ offset: number, length: number }>} */ (this.cff.globalSubrIndex || []),\n gsubrs\n );\n }\n\n /**\n * @param {Array<{ offset: number, length: number }>} subrs\n * @param {Record<string | number, boolean>} used\n * @returns {BinaryBuffer[]}\n */\n subsetSubrs(subrs, used) {\n /** @type {BinaryBuffer[]} */\n let res = [];\n for (let i = 0; i < subrs.length; i++) {\n let subr = subrs[i];\n if (used[i]) {\n this.cff.stream.pos = subr.offset;\n res.push(this.cff.stream.readBuffer(subr.length));\n } else {\n res.push(new Uint8Array([11])); // return\n }\n }\n\n return res;\n }\n\n /**\n * @param {CFFTopDict} topDict\n * @returns {void}\n */\n subsetFontdict(topDict) {\n topDict.FDArray = [];\n topDict.FDSelect = {\n version: 0,\n fds: []\n };\n\n /** @type {Record<number, boolean>} */\n let used_fds = {};\n /** @type {Array<Record<string, boolean>>} */\n let used_subrs = [];\n /** @type {Record<number, number>} */\n let fd_select = {};\n for (let gid of this.glyphs) {\n if (!this.cff.fdForGlyph) {\n continue;\n }\n let fd = this.cff.fdForGlyph(gid);\n if (fd == null) {\n continue;\n }\n\n if (!used_fds[fd]) {\n let src = this.cff.topDict.FDArray && this.cff.topDict.FDArray[fd];\n topDict.FDArray.push(Object.assign({}, src));\n used_subrs.push({});\n fd_select[fd] = topDict.FDArray.length - 1;\n }\n\n used_fds[fd] = true;\n if (topDict.FDSelect.fds) {\n topDict.FDSelect.fds.push(fd_select[fd]);\n }\n\n let glyph = this.font.getGlyph(gid);\n if (!glyph) {\n continue;\n }\n void glyph.path; // this causes the glyph to be parsed\n if (glyph._usedSubrs) {\n for (let subr in glyph._usedSubrs) {\n used_subrs[fd_select[fd]][subr] = true;\n }\n }\n }\n\n for (let i = 0; i < topDict.FDArray.length; i++) {\n let dict = topDict.FDArray[i];\n delete dict.FontName;\n if (dict.Private && dict.Private.Subrs) {\n dict.Private = Object.assign({}, dict.Private);\n dict.Private.Subrs = this.subsetSubrs(\n /** @type {Array<{ offset: number, length: number }>} */ (dict.Private.Subrs),\n used_subrs[i]\n );\n }\n }\n\n return;\n }\n\n /**\n * @param {CFFTopDict} topDict\n * @returns {StructValue}\n */\n createCIDFontdict(topDict) {\n /** @type {Record<string, boolean>} */\n let used_subrs = {};\n for (let gid of this.glyphs) {\n let glyph = this.font.getGlyph(gid);\n if (!glyph) {\n continue;\n }\n void glyph.path; // this causes the glyph to be parsed\n\n if (glyph._usedSubrs) {\n for (let subr in glyph._usedSubrs) {\n used_subrs[subr] = true;\n }\n }\n }\n\n let privateDict = Object.assign({}, this.cff.topDict.Private);\n if (this.cff.topDict.Private && this.cff.topDict.Private.Subrs) {\n privateDict.Subrs = this.subsetSubrs(\n /** @type {Array<{ offset: number, length: number }>} */ (this.cff.topDict.Private.Subrs),\n used_subrs\n );\n }\n\n topDict.FDArray = [{ Private: privateDict }];\n let charstrings = this.charstrings || [];\n return topDict.FDSelect = {\n version: 3,\n nRanges: 1,\n ranges: [{ first: 0, fd: 0 }],\n sentinel: charstrings.length\n };\n }\n\n /**\n * @param {string | null | undefined} string\n * @returns {number | null}\n */\n addString(string) {\n if (!string) {\n return null;\n }\n\n if (!this.strings) {\n this.strings = [];\n }\n\n this.strings.push(string);\n return standardStrings.length + this.strings.length - 1;\n }\n\n /**\n * @returns {import('restructure').BinaryBuffer}\n */\n encode() {\n this.subsetCharstrings();\n\n let charstrings = this.charstrings || [];\n\n let charset = {\n version: charstrings.length > 255 ? 2 : 1,\n ranges: charstrings.length > 1\n ? [{ first: 1, nLeft: charstrings.length - 2 }]\n : []\n };\n\n let topDict = /** @type {CFFTopDict} */ (Object.assign({}, this.cff.topDict));\n topDict.Private = null;\n topDict.charset = charset;\n topDict.Encoding = null;\n topDict.CharStrings = charstrings;\n\n for (let key of ['version', 'Notice', 'Copyright', 'FullName', 'FamilyName', 'Weight', 'PostScript', 'BaseFontName', 'FontName']) {\n let sid = /** @type {number | null | undefined} */ (topDict[key]);\n topDict[key] = this.cff.string ? this.addString(this.cff.string(sid)) : null;\n }\n\n topDict.ROS = [this.addString('Adobe'), this.addString('Identity'), 0];\n topDict.CIDCount = charstrings.length;\n\n if (this.cff.isCIDFont) {\n this.subsetFontdict(topDict);\n } else {\n this.createCIDFontdict(topDict);\n }\n\n let top = {\n version: 1,\n hdrSize: this.cff.hdrSize,\n offSize: 4,\n header: this.cff.header,\n nameIndex: [this.cff.postscriptName],\n topDictIndex: [topDict],\n stringIndex: this.strings,\n globalSubrIndex: this.gsubrs\n };\n\n return CFFTop.toBuffer(top);\n }\n}\n", "import { cache } from './decorators';\nimport * as fontkit from './base';\nimport * as r from 'restructure';\nimport Directory from './tables/directory';\nimport tables from './tables';\nimport CmapProcessor from './CmapProcessor';\nimport LayoutEngine from './layout/LayoutEngine';\nimport TTFGlyph from './glyph/TTFGlyph';\nimport CFFGlyph from './glyph/CFFGlyph';\nimport SBIXGlyph from './glyph/SBIXGlyph';\nimport COLRGlyph from './glyph/COLRGlyph';\nimport CBDTGlyph from './glyph/CBDTGlyph';\nimport GlyphVariationProcessor from './glyph/GlyphVariationProcessor';\nimport TTFSubset from './subset/TTFSubset';\nimport CFFSubset from './subset/CFFSubset';\nimport BBox from './glyph/BBox';\nimport { asciiDecoder } from './utils';\n\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').BinaryBuffer} BinaryBuffer */\n/** @typedef {import('../types/fontkit').FontDirectory} FontDirectory */\n/** @typedef {import('../types/fontkit').FontLike} FontLike */\n/** @typedef {import('../types/fontkit').FontMetrics} FontMetrics */\n/** @typedef {import('../types/fontkit').TableEntry} TableEntry */\n/** @typedef {import('../types/fontkit').TableCodec} TableCodec */\n/** @typedef {import('../types/fontkit').VariationCoords} VariationCoords */\n/** @typedef {import('../types/fontkit').NameString} NameString */\n/** @typedef {import('../types/fontkit').HeadTable} HeadTable */\n/** @typedef {import('../types/fontkit').HheaTable} HheaTable */\n/** @typedef {import('../types/fontkit').MaxpTable} MaxpTable */\n/** @typedef {import('../types/fontkit').OS2Table} OS2Table */\n/** @typedef {import('../types/fontkit').NameTable} NameTable */\n/** @typedef {import('../types/fontkit').PostTable} PostTable */\n/** @typedef {import('../types/fontkit').CmapTable} CmapTable */\n/** @typedef {import('../types/fontkit').MetricsTable} MetricsTable */\n/** @typedef {import('../types/fontkit').FvarTable} FvarTable */\n/** @typedef {import('../types/fontkit').FvarAxis} FvarAxis */\n/** @typedef {import('../types/fontkit').CFFFontLike} CFFFontLike */\n/** @typedef {import('../types/fontkit').FeatureInput} FeatureInput */\n/** @typedef {import('../types/fontkit').ScriptTag} ScriptTag */\n/** @typedef {import('../types/fontkit').LanguageTag} LanguageTag */\n/** @typedef {import('../types/fontkit').TextDirection} TextDirection */\n/** @typedef {import('./glyph/Glyph').default} Glyph */\n/** @typedef {import('./layout/GlyphRun').default} GlyphRun */\n/** @typedef {import('./subset/Subset').default} Subset */\n\n/**\n * Axis description from {@link TTFFont#variationAxes}.\n * @typedef {{ name: NameString | undefined, min: number, default: number, max: number }} VariationAxisInfo\n */\n\n/**\n * This is the base class for all SFNT-based font formats in fontkit.\n * It supports TrueType, and PostScript glyphs, and several color glyph formats.\n *\n * Dynamic SFNT table accessors (`cmap`, `head`, `hhea`, \u2026) are installed by\n * `_installTableGetters` and typed here so call sites see real table shapes.\n *\n * @implements {FontLike}\n */\nexport default class TTFFont {\n /** @type {string} */\n type = 'TTF';\n\n /** @type {DecodeStream} */\n stream = new r.DecodeStream(new Uint8Array(0));\n /** @type {FontDirectory} */\n directory = /** @type {FontDirectory} */ ({ tables: {} });\n /** @type {string | null} */\n defaultLanguage = null;\n /** @type {number[] | null} */\n variationCoords = null;\n /** @type {number} */\n _directoryPos = 0;\n /** @type {Record<string, unknown>} */\n _tables = {};\n /** @type {Record<number, Glyph | undefined>} */\n _glyphs = {};\n /** @type {FontMetrics | undefined} */\n _metrics;\n\n // SFNT tables installed as configurable getters by `_installTableGetters`.\n /** @type {CmapTable | undefined} */\n cmap;\n /** @type {HeadTable} */\n head = /** @type {HeadTable} */ ({ unitsPerEm: 0, xMin: 0, yMin: 0, xMax: 0, yMax: 0 });\n /** @type {HheaTable | undefined} */\n hhea;\n /** @type {MetricsTable} */\n hmtx = /** @type {MetricsTable} */ ({\n metrics: { length: 0, get() { return undefined; } },\n bearings: { length: 0, get() { return undefined; } }\n });\n\n /** @type {MaxpTable} */\n maxp = { numGlyphs: 0 };\n /** @type {NameTable | undefined} */\n name;\n /** @type {OS2Table | undefined} */\n 'OS/2';\n /** @type {PostTable} */\n post = { version: 0, italicAngle: 0, underlinePosition: 0, underlineThickness: 0 };\n /** @type {FvarTable | undefined} */\n fvar;\n /** @type {CFFFontLike | undefined} */\n CFF2;\n /** @type {CFFFontLike | undefined} */\n 'CFF ';\n\n /**\n * @param {ArrayBufferView} buffer\n * @returns {boolean}\n */\n static probe(buffer) {\n let bytes\n = buffer instanceof Uint8Array\n ? buffer\n : new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n let format = asciiDecoder.decode(bytes.subarray(0, 4));\n return format === 'true' || format === 'OTTO' || format === String.fromCharCode(0, 1, 0, 0);\n }\n\n /**\n * @param {DecodeStream} stream\n * @param {number[] | null} [variationCoords]\n */\n constructor(stream, variationCoords = null) {\n this.defaultLanguage = null;\n this.stream = stream;\n this.variationCoords = variationCoords;\n\n this._directoryPos = this.stream.pos;\n this._tables = {};\n this._glyphs = {};\n this._metrics = undefined;\n this.directory = /** @type {FontDirectory} */ ({ tables: {} });\n\n this._decodeDirectory();\n this._installTableGetters();\n }\n\n /**\n * @param {DecodeStream} stream\n * @returns {void}\n */\n _setStream(stream) {\n this.stream = stream;\n }\n\n /** @returns {void} */\n _installTableGetters() {\n let tableMap = this.directory.tables;\n for (let tag in tableMap) {\n let table = tableMap[tag];\n let codec = tables[tag];\n if (codec && table && table.length > 0) {\n Object.defineProperty(this, tag, {\n get: this._getTable.bind(this, table),\n configurable: true\n });\n }\n }\n }\n\n /**\n * @param {string | null} [lang]\n * @returns {void}\n */\n setDefaultLanguage(lang = null) {\n this.defaultLanguage = lang;\n }\n\n /**\n * @param {TableEntry} table\n * @returns {unknown}\n */\n _getTable(table) {\n if (!(table.tag in this._tables)) {\n try {\n this._tables[table.tag] = this._decodeTable(table);\n } catch (e) {\n if (fontkit.logErrors) {\n console.error(`Error decoding table ${table.tag}`);\n let err = /** @type {{ stack?: string }} */ (e);\n console.error(err.stack);\n }\n }\n }\n\n return this._tables[table.tag];\n }\n\n /**\n * @param {string} tag\n * @returns {DecodeStream | null}\n */\n _getTableStream(tag) {\n let table = this.directory.tables[tag];\n if (table) {\n this.stream.pos = table.offset;\n return this.stream;\n }\n\n return null;\n }\n\n /** @returns {void} */\n _decodeDirectory() {\n this.directory = /** @type {FontDirectory} */ (\n /** @type {unknown} */ (Directory.decode(this.stream, { _startOffset: 0 }))\n );\n }\n\n /**\n * @param {TableEntry} table\n * @returns {unknown}\n */\n _decodeTable(table) {\n let pos = this.stream.pos;\n\n let stream = this._getTableStream(table.tag);\n let codec = /** @type {TableCodec | undefined} */ (tables[table.tag]);\n if (!stream || !codec || !codec.decode) {\n this.stream.pos = pos;\n return undefined;\n }\n\n let result = codec.decode(stream, this, table.length);\n\n this.stream.pos = pos;\n return result;\n }\n\n /**\n * @returns {FontMetrics}\n */\n _getMetrics() {\n if (this._metrics) {\n return this._metrics;\n }\n\n // Same compromise as FreeType for ascender/descender/height:\n // https://gitlab.freedesktop.org/freetype/freetype/-/blob/master/src/sfnt/sfobjs.c\n // typo*/win* fields exist only in OS/2 version >= 1\n let os2 = this['OS/2'];\n let hasTypo = !!(os2 && os2.version > 0);\n /** @type {number} */\n let ascent;\n /** @type {number} */\n let descent;\n /** @type {number} */\n let lineGap;\n\n if (hasTypo && os2 && os2.fsSelection.useTypoMetrics) {\n ascent = /** @type {number} */ (os2.typoAscender);\n descent = /** @type {number} */ (os2.typoDescender);\n lineGap = /** @type {number} */ (os2.typoLineGap);\n } else {\n let hhea = this.hhea;\n if (!hhea) {\n throw new Error('Missing hhea table');\n }\n ({ ascent, descent, lineGap } = hhea);\n\n // Only when both hhea values are zero \u2014 FreeType uses !(ascender || descender)\n if (!(ascent || descent) && hasTypo && os2) {\n if (os2.typoAscender || os2.typoDescender) {\n ascent = /** @type {number} */ (os2.typoAscender);\n descent = /** @type {number} */ (os2.typoDescender);\n lineGap = /** @type {number} */ (os2.typoLineGap);\n } else {\n ascent = /** @type {number} */ (os2.winAscent);\n descent = -(/** @type {number} */ (os2.winDescent));\n lineGap = 0;\n }\n }\n }\n\n return this._metrics = {\n ascent,\n descent,\n lineGap,\n lineHeight: ascent - descent + lineGap\n };\n }\n\n /**\n * Gets a string from the font's `name` table\n * `lang` is a BCP-47 language code.\n * @param {string} key\n * @param {string | null} [lang]\n * @returns {NameString | null}\n */\n getName(key, lang = this.defaultLanguage || fontkit.defaultLanguage) {\n let record = this.name && this.name.records[key];\n if (record && typeof record === 'object') {\n // Attempt to retrieve the entry, depending on which translation is available:\n /** @type {import('../types/fontkit').NameLocaleMap} */\n let locales = /** @type {import('../types/fontkit').NameLocaleMap} */ (record);\n return (\n (lang ? locales[lang] : undefined)\n || (this.defaultLanguage ? locales[this.defaultLanguage] : undefined)\n || locales[fontkit.defaultLanguage]\n || locales['en']\n || locales[Object.keys(locales)[0]] // Seriously, ANY language would be fine\n || null\n );\n }\n\n return null;\n }\n\n /**\n * The unique PostScript name for this font, e.g. \"Helvetica-Bold\"\n * @type {NameString | null}\n */\n get postscriptName() {\n return this.getName('postscriptName');\n }\n\n /**\n * The font's full name, e.g. \"Helvetica Bold\"\n * @type {NameString | null}\n */\n get fullName() {\n return this.getName('fullName');\n }\n\n /**\n * The font's family name, e.g. \"Helvetica\"\n * @type {NameString | null}\n */\n get familyName() {\n return this.getName('fontFamily');\n }\n\n /**\n * The font's sub-family, e.g. \"Bold\".\n * @type {NameString | null}\n */\n get subfamilyName() {\n return this.getName('fontSubfamily');\n }\n\n /**\n * The font's copyright information\n * @type {NameString | null}\n */\n get copyright() {\n return this.getName('copyright');\n }\n\n /**\n * The font's version number\n * @type {NameString | null}\n */\n get version() {\n return this.getName('version');\n }\n\n /**\n * The font\u2019s [ascender](https://en.wikipedia.org/wiki/Ascender_(typography))\n * @type {number}\n */\n get ascent() {\n return this._getMetrics().ascent;\n }\n\n /**\n * The font\u2019s [descender](https://en.wikipedia.org/wiki/Descender)\n * @type {number}\n */\n get descent() {\n return this._getMetrics().descent;\n }\n\n /**\n * The amount of space that should be included between lines\n * @type {number}\n */\n get lineGap() {\n return this._getMetrics().lineGap;\n }\n\n /**\n * The offset from the normal underline position that should be used\n * @type {number}\n */\n get underlinePosition() {\n return this.post.underlinePosition;\n }\n\n /**\n * The weight of the underline that should be used\n * @type {number}\n */\n get underlineThickness() {\n return this.post.underlineThickness;\n }\n\n /**\n * If this is an italic font, the angle the cursor should be drawn at to match the font design\n * @type {number}\n */\n get italicAngle() {\n return this.post.italicAngle;\n }\n\n /**\n * The vertical space between adjacent lines (their baselines) of text.\n * See [here](https://en.wikipedia.org/wiki/Leading) for more details.\n * @type {number}\n */\n get lineHeight() {\n return this._getMetrics().lineHeight;\n }\n\n /**\n * The height of capital letters above the baseline.\n * See [here](https://en.wikipedia.org/wiki/Cap_height) for more details.\n * @type {number}\n */\n get capHeight() {\n let os2 = this['OS/2'];\n return os2 && os2.capHeight != null ? os2.capHeight : this.ascent;\n }\n\n /**\n * The height of lower case letters in the font.\n * See [here](https://en.wikipedia.org/wiki/X-height) for more details.\n * @type {number}\n */\n get xHeight() {\n let os2 = this['OS/2'];\n return os2 && os2.xHeight != null ? os2.xHeight : 0;\n }\n\n /**\n * The number of glyphs in the font.\n * @type {number}\n */\n get numGlyphs() {\n return this.maxp.numGlyphs;\n }\n\n /**\n * The size of the font\u2019s internal coordinate grid\n * @type {number}\n */\n get unitsPerEm() {\n return this.head.unitsPerEm;\n }\n\n /**\n * The font\u2019s bounding box, i.e. the box that encloses all glyphs in the font.\n * @type {BBox}\n */\n @cache\n get bbox() {\n return Object.freeze(new BBox(this.head.xMin, this.head.yMin, this.head.xMax, this.head.yMax));\n }\n\n /**\n * @type {CmapProcessor}\n */\n @cache\n get _cmapProcessor() {\n return new CmapProcessor(/** @type {CmapTable} */ (this.cmap));\n }\n\n /**\n * An array of all of the unicode code points supported by the font.\n * @type {number[]}\n */\n @cache\n get characterSet() {\n return this._cmapProcessor.getCharacterSet();\n }\n\n /**\n * Returns whether there is glyph in the font for the given unicode code point.\n *\n * @param {number} codePoint\n * @return {boolean}\n */\n hasGlyphForCodePoint(codePoint) {\n return !!this._cmapProcessor.lookup(codePoint);\n }\n\n /**\n * Maps a single unicode code point to a Glyph object.\n * Does not perform any advanced substitutions (there is no context to do so).\n *\n * @param {number} codePoint\n * @return {Glyph | null}\n */\n glyphForCodePoint(codePoint) {\n return this.getGlyph(this._cmapProcessor.lookup(codePoint), [codePoint]);\n }\n\n /**\n * Returns an array of Glyph objects for the given string.\n * This is only a one-to-one mapping from characters to glyphs.\n * For most uses, you should use font.layout (described below), which\n * provides a much more advanced mapping supporting AAT and OpenType shaping.\n *\n * @param {string} string\n * @return {Glyph[]}\n */\n glyphsForString(string) {\n /** @type {Glyph[]} */\n let glyphs = [];\n let len = string.length;\n let idx = 0;\n let last = -1;\n let state = -1;\n\n while (idx <= len) {\n let code = 0;\n let nextState = 0;\n\n if (idx < len) {\n // Decode the next codepoint from UTF 16\n code = string.charCodeAt(idx++);\n if (0xd800 <= code && code <= 0xdbff && idx < len) {\n let next = string.charCodeAt(idx);\n if (0xdc00 <= next && next <= 0xdfff) {\n idx++;\n code = ((code & 0x3ff) << 10) + (next & 0x3ff) + 0x10000;\n }\n }\n\n // Compute the next state: 1 if the next codepoint is a variation selector, 0 otherwise.\n nextState = ((0xfe00 <= code && code <= 0xfe0f) || (0xe0100 <= code && code <= 0xe01ef)) ? 1 : 0;\n } else {\n idx++;\n }\n\n if (state === 0 && nextState === 1) {\n // Variation selector following normal codepoint.\n let g = this.getGlyph(this._cmapProcessor.lookup(last, code), [last, code]);\n if (g) {\n glyphs.push(g);\n }\n } else if (state === 0 && nextState === 0) {\n // Normal codepoint following normal codepoint.\n let g = this.glyphForCodePoint(last);\n if (g) {\n glyphs.push(g);\n }\n }\n\n last = code;\n state = nextState;\n }\n\n return glyphs;\n }\n\n /**\n * @type {LayoutEngine}\n */\n @cache\n get _layoutEngine() {\n return new LayoutEngine(this);\n }\n\n /**\n * Returns a GlyphRun object, which includes an array of Glyphs and GlyphPositions for the given string.\n *\n * @param {string} string\n * @param {FeatureInput} [userFeatures]\n * @param {ScriptTag} [script]\n * @param {LanguageTag} [language]\n * @param {TextDirection} [direction]\n * @return {GlyphRun}\n */\n layout(string, userFeatures, script, language, direction) {\n return this._layoutEngine.layout(string, userFeatures, script, language, direction);\n }\n\n /**\n * Returns an array of strings that map to the given glyph id.\n * @param {number} gid - glyph id\n * @returns {string[]}\n */\n stringsForGlyph(gid) {\n return this._layoutEngine.stringsForGlyph(gid);\n }\n\n /**\n * An array of all [OpenType feature tags](https://www.microsoft.com/typography/otspec/featuretags.htm)\n * (or mapped AAT tags) supported by the font.\n * The features parameter is an array of OpenType feature tags to be applied in addition to the default set.\n * If this is an AAT font, the OpenType feature tags are mapped to AAT features.\n *\n * @type {string[]}\n */\n get availableFeatures() {\n return this._layoutEngine.getAvailableFeatures();\n }\n\n /**\n * @param {ScriptTag} [script]\n * @param {LanguageTag} [language]\n * @returns {string[]}\n */\n getAvailableFeatures(script, language) {\n return this._layoutEngine.getAvailableFeatures(script, language);\n }\n\n /**\n * @param {number} glyph\n * @param {number[]} [characters]\n * @returns {Glyph | null | undefined}\n */\n _getBaseGlyph(glyph, characters = []) {\n let cached = this._glyphs[glyph];\n if (cached && typeof (/** @type {{ _getContours?: unknown }} */ (cached))._getContours === 'function') {\n return cached;\n }\n\n /** @type {Glyph | null} */\n let outline = null;\n if (this.directory.tables.glyf) {\n outline = new TTFGlyph(glyph, characters, this);\n } else if (this.directory.tables['CFF '] || this.directory.tables.CFF2) {\n outline = new CFFGlyph(glyph, characters, this);\n }\n\n if (outline && !cached) {\n this._glyphs[glyph] = outline;\n }\n\n return outline;\n }\n\n /**\n * Returns a glyph object for the given glyph id.\n * You can pass the array of code points this glyph represents for\n * your use later, and it will be stored in the glyph object.\n *\n * @param {number} glyph\n * @param {number[]} [characters]\n * @return {Glyph | null}\n */\n getGlyph(glyph, characters = []) {\n if (!this._glyphs[glyph]) {\n if (this.directory.tables.sbix) {\n this._glyphs[glyph] = new SBIXGlyph(glyph, characters, this);\n } else if ((this.directory.tables.COLR) && (this.directory.tables.CPAL)) {\n this._glyphs[glyph] = new COLRGlyph(glyph, characters, this);\n } else if (this.directory.tables.CBLC || this.directory.tables.EBLC) {\n this._glyphs[glyph] = new CBDTGlyph(glyph, characters, this);\n } else {\n this._getBaseGlyph(glyph, characters);\n }\n }\n\n return this._glyphs[glyph] || null;\n }\n\n /**\n * Returns a Subset for this font.\n * @return {Subset}\n */\n createSubset() {\n if (this.directory.tables['CFF ']) {\n return new CFFSubset(this);\n }\n\n return new TTFSubset(this);\n }\n\n /**\n * Returns an object describing the available variation axes\n * that this font supports. Keys are setting tags, and values\n * contain the axis name, range, and default value.\n *\n * @type {Record<string, VariationAxisInfo>}\n */\n @cache\n get variationAxes() {\n /** @type {Record<string, VariationAxisInfo>} */\n let res = {};\n if (!this.fvar) {\n return res;\n }\n\n for (let axis of this.fvar.axis) {\n res[axis.axisTag.trim()] = {\n name: axis.name && axis.name.en,\n min: axis.minValue,\n default: axis.defaultValue,\n max: axis.maxValue\n };\n }\n\n return res;\n }\n\n /**\n * Returns an object describing the named variation instances\n * that the font designer has specified. Keys are variation names\n * and values are the variation settings for this instance.\n *\n * @type {Record<string, Record<string, number>>}\n */\n @cache\n get namedVariations() {\n /** @type {Record<string, Record<string, number>>} */\n let res = {};\n if (!this.fvar) {\n return res;\n }\n\n for (let instance of this.fvar.instance) {\n /** @type {Record<string, number>} */\n let settings = {};\n for (let i = 0; i < this.fvar.axis.length; i++) {\n let axis = this.fvar.axis[i];\n settings[axis.axisTag.trim()] = instance.coord[i];\n }\n\n let key = instance.name && instance.name.en;\n if (typeof key === 'string') {\n res[key] = settings;\n }\n }\n\n return res;\n }\n\n /**\n * Returns a new font with the given variation settings applied.\n * Settings can either be an instance name, or an object containing\n * variation tags as specified by the `variationAxes` property.\n *\n * @param {string | Record<string, number>} settings\n * @return {TTFFont}\n */\n getVariation(settings) {\n if (!(this.directory.tables.fvar && ((this.directory.tables.gvar && this.directory.tables.glyf) || this.directory.tables.CFF2))) {\n throw new Error('Variations require a font with the fvar, gvar and glyf, or CFF2 tables.');\n }\n\n /** @type {Record<string, number> | undefined} */\n let resolved;\n if (typeof settings === 'string') {\n resolved = this.namedVariations[settings];\n } else {\n resolved = settings;\n }\n\n if (typeof resolved !== 'object' || resolved == null) {\n throw new Error('Variation settings must be either a variation name or settings object.');\n }\n\n let fvar = /** @type {FvarTable} */ (this.fvar);\n\n // normalize the coordinates\n let coords = fvar.axis.map((/** @type {FvarAxis} */ axis) => {\n let axisTag = axis.axisTag.trim();\n if (axisTag in resolved) {\n return Math.max(axis.minValue, Math.min(axis.maxValue, resolved[axisTag]));\n } else {\n return axis.defaultValue;\n }\n });\n\n // Decompress WOFF/WOFF2 on the source once so the clone shares resolved tables.\n let maybeDecompress = /** @type {{ _decompress?: () => void }} */ (this)._decompress;\n if (typeof maybeDecompress === 'function') {\n maybeDecompress.call(this);\n }\n\n // Preserve subclass (WOFF/WOFF2) and share decoded state. @cache values and\n // table getters are non-enumerable, so Object.assign skips them; we reinstall\n // getters and clear the glyph cache for this variation instance.\n let font = Object.create(Object.getPrototypeOf(this));\n Object.assign(font, this);\n font.variationCoords = coords;\n font._glyphs = {};\n font._installTableGetters();\n return font;\n }\n\n /**\n * @type {GlyphVariationProcessor | null}\n */\n @cache\n get _variationProcessor() {\n if (!this.fvar) {\n return null;\n }\n\n let variationCoords = this.variationCoords;\n\n // Ignore if no variation coords and not CFF2\n if (!variationCoords && !this.CFF2) {\n return null;\n }\n\n if (!variationCoords) {\n variationCoords = this.fvar.axis.map((/** @type {FvarAxis} */ axis) => axis.defaultValue);\n }\n\n return new GlyphVariationProcessor(this, variationCoords);\n }\n\n // Standardized format plugin API\n /**\n * @param {string | Uint8Array | Record<string, number>} name\n * @returns {TTFFont}\n */\n getFont(name) {\n return this.getVariation(/** @type {string | Record<string, number>} */ (name));\n }\n}\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('../../types/fontkit').TableEntry} TableEntry */\n\n/**\n * @typedef {StructValue & {\n * tables: TableEntry[] | Record<string, TableEntry>\n * }} WOFFDirectoryValue\n */\n\nlet WOFFDirectoryEntry = new r.Struct({\n tag: new r.String(4),\n offset: new r.Pointer(r.uint32, 'void', { type: 'global' }),\n compLength: r.uint32,\n length: r.uint32,\n origChecksum: r.uint32\n});\n\n/** @type {import('restructure').Struct} */\nlet WOFFDirectory = new r.Struct({\n tag: new r.String(4), // should be 'wOFF'\n flavor: r.uint32,\n length: r.uint32,\n numTables: r.uint16,\n reserved: new r.Reserved(r.uint16),\n totalSfntSize: r.uint32,\n majorVersion: r.uint16,\n minorVersion: r.uint16,\n metaOffset: r.uint32,\n metaLength: r.uint32,\n metaOrigLength: r.uint32,\n privOffset: r.uint32,\n privLength: r.uint32,\n tables: new r.Array(WOFFDirectoryEntry, 'numTables')\n});\n\nWOFFDirectory.process = function () {\n let self = /** @type {WOFFDirectoryValue} */ (this);\n /** @type {Record<string, TableEntry>} */\n let tables = {};\n for (let table of /** @type {TableEntry[]} */ (self.tables)) {\n tables[table.tag] = table;\n }\n\n self.tables = tables;\n};\n\nexport default WOFFDirectory;\n", "import TTFFont from './TTFFont';\nimport WOFFDirectory from './tables/WOFFDirectory';\nimport { unzlibSync } from 'fflate';\nimport * as r from 'restructure';\nimport { asciiDecoder } from './utils';\n\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').BinaryBuffer} BinaryBuffer */\n/** @typedef {import('../types/fontkit').FontDirectory} FontDirectory */\n/** @typedef {import('../types/fontkit').TableEntry} TableEntry */\n\nexport default class WOFFFont extends TTFFont {\n /** @type {string} */\n type = 'WOFF';\n\n /** @type {boolean | undefined} */\n _decompressed;\n\n /**\n * @param {ArrayBufferView} buffer\n * @returns {boolean}\n */\n static probe(buffer) {\n let bytes\n = buffer instanceof Uint8Array\n ? buffer\n : new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n return asciiDecoder.decode(bytes.subarray(0, 4)) === 'wOFF';\n }\n\n /** @returns {void} */\n _decodeDirectory() {\n this.directory = /** @type {FontDirectory} */ (\n /** @type {unknown} */ (WOFFDirectory.decode(this.stream, { _startOffset: 0 }))\n );\n }\n\n /**\n * @param {TableEntry} table\n * @returns {unknown}\n */\n _decodeTable(table) {\n this._decompress();\n return super._decodeTable(table);\n }\n\n // Inflate all tables into one stream so internal offsets (e.g. gvar) stay\n // valid against this.stream \u2014 same reason WOFF2Font decompresses up front.\n /** @returns {void} */\n _decompress() {\n if (this._decompressed) {\n return;\n }\n\n let totalSize = 0;\n /** @type {Array<{ entry: TableEntry, newOffset: number }>} */\n let layout = [];\n let tableMap = this.directory.tables;\n for (let tag in tableMap) {\n let entry = tableMap[tag];\n if (!entry) {\n continue;\n }\n layout.push({ entry, newOffset: totalSize });\n totalSize = (totalSize + entry.length + 3) & ~3;\n }\n\n let buffer = new Uint8Array(totalSize);\n for (let { entry, newOffset } of layout) {\n this.stream.pos = entry.offset;\n /** @type {BinaryBuffer | Uint8Array} */\n let data;\n let compLength = entry.compLength != null ? entry.compLength : entry.length;\n if (compLength < entry.length) {\n let compressed = this.stream.readBuffer(compLength);\n let compressedBytes\n = compressed instanceof Uint8Array\n ? compressed\n : new Uint8Array(compressed.buffer, compressed.byteOffset, compressed.byteLength);\n data = unzlibSync(compressedBytes, {\n out: new Uint8Array(entry.length)\n });\n } else {\n data = this.stream.readBuffer(entry.length);\n }\n buffer.set(data instanceof Uint8Array ? data : new Uint8Array(data.buffer, data.byteOffset, data.byteLength), newOffset);\n entry.offset = newOffset;\n }\n\n this._setStream(new r.DecodeStream(buffer));\n this._decompressed = true;\n }\n}\n", "import * as r from 'restructure';\nimport brotli from 'brotli/decompress.js';\nimport TTFFont from './TTFFont';\nimport TTFGlyph, { Point } from './glyph/TTFGlyph';\nimport WOFF2Glyph from './glyph/WOFF2Glyph';\nimport WOFF2Directory from './tables/WOFF2Directory';\nimport { asciiDecoder } from './utils';\n\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('restructure').BinaryBuffer} BinaryBuffer */\n/** @typedef {import('restructure').BaseType} BaseType */\n/** @typedef {import('../types/fontkit').FontDirectory} FontDirectory */\n/** @typedef {import('../types/fontkit').TableEntry} TableEntry */\n/** @typedef {import('../types/fontkit').TransformedGlyf} TransformedGlyf */\n/** @typedef {import('../types/fontkit').DecodedGlyf} DecodedGlyf */\n/** @typedef {import('./glyph/Glyph').default} Glyph */\n\n/**\n * Subclass of TTFFont that represents a TTF/OTF font compressed by WOFF2\n * See spec here: http://www.w3.org/TR/WOFF2/\n *\n * @property {number} [_dataPos] Byte offset of the compressed table data (set in `_decodeDirectory`).\n */\nexport default class WOFF2Font extends TTFFont {\n /** @type {string} */\n type = 'WOFF2';\n\n // NOTE: Do not declare `_dataPos` as a class field. It is assigned in\n // `_decodeDirectory()` during `super()`, and subclass field initializers\n // run *after* `super()` returns \u2014 which would wipe the real offset.\n\n /** @type {boolean | undefined} */\n _decompressed;\n /** @type {(TransformedGlyf | undefined)[] | undefined} */\n _transformedGlyphs;\n\n /**\n * @param {ArrayBufferView} buffer\n * @returns {boolean}\n */\n static probe(buffer) {\n let bytes\n = buffer instanceof Uint8Array\n ? buffer\n : new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n return asciiDecoder.decode(bytes.subarray(0, 4)) === 'wOF2';\n }\n\n /** @returns {void} */\n _decodeDirectory() {\n this.directory = /** @type {FontDirectory} */ (\n /** @type {unknown} */ (WOFF2Directory.decode(this.stream))\n );\n this._dataPos = this.stream.pos;\n }\n\n /** @returns {void} */\n _decompress() {\n // decompress data and setup table offsets if we haven't already\n if (!this._decompressed) {\n let dataPos = this._dataPos;\n if (dataPos == null) {\n throw new Error('Missing WOFF2 data offset; directory was not decoded');\n }\n this.stream.pos = dataPos;\n let totalCompressedSize = this.directory.totalCompressedSize;\n if (totalCompressedSize == null) {\n throw new Error('Missing totalCompressedSize in WOFF2 directory');\n }\n let buffer = this.stream.readBuffer(totalCompressedSize);\n\n let decompressedSize = 0;\n let tableMap = this.directory.tables;\n for (let tag in tableMap) {\n let entry = tableMap[tag];\n if (!entry) {\n continue;\n }\n entry.offset = decompressedSize;\n decompressedSize += (entry.transformLength != null) ? entry.transformLength : entry.length;\n }\n\n let decompressed = brotli(\n buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength),\n decompressedSize\n );\n if (!decompressed) {\n throw new Error('Error decoding compressed data in WOFF2');\n }\n\n this._setStream(new r.DecodeStream(decompressed));\n this._decompressed = true;\n }\n }\n\n /**\n * @param {TableEntry} table\n * @returns {unknown}\n */\n _decodeTable(table) {\n this._decompress();\n return super._decodeTable(table);\n }\n\n // Override this method to get a glyph and return our\n // custom subclass if there is a glyf table.\n /**\n * @param {number} glyph\n * @param {number[]} [characters]\n * @returns {Glyph | null | undefined}\n */\n _getBaseGlyph(glyph, characters = []) {\n let cached = this._glyphs[glyph];\n if (cached && typeof (/** @type {{ _getContours?: unknown }} */ (cached))._getContours === 'function') {\n return cached;\n }\n\n let glyfEntry = this.directory.tables.glyf;\n if (glyfEntry && glyfEntry.transformed) {\n if (!this._transformedGlyphs) { this._transformGlyfTable(); }\n let outline = new WOFF2Glyph(glyph, characters, this);\n if (!cached) {\n this._glyphs[glyph] = outline;\n }\n return outline;\n }\n\n return super._getBaseGlyph(glyph, characters);\n }\n\n /** @returns {void} */\n _transformGlyfTable() {\n this._decompress();\n let glyfEntry = this.directory.tables.glyf;\n if (!glyfEntry) {\n this._transformedGlyphs = [];\n return;\n }\n this.stream.pos = glyfEntry.offset;\n let table = /** @type {GlyfTableDecoded} */ (GlyfTable.decode(this.stream));\n /** @type {TransformedGlyf[]} */\n let glyphs = [];\n\n for (let index = 0; index < table.numGlyphs; index++) {\n /** @type {TransformedGlyf} */\n let glyph = { numberOfContours: 0 };\n let nContours = table.nContours.readInt16BE();\n glyph.numberOfContours = nContours;\n\n if (nContours > 0) { // simple glyph\n /** @type {number[]} */\n let nPoints = [];\n let totalPoints = 0;\n\n for (let i = 0; i < nContours; i++) {\n let r = read255UInt16(table.nPoints);\n totalPoints += r;\n nPoints.push(totalPoints);\n }\n\n glyph.points = decodeTriplet(table.flags, table.glyphs, totalPoints);\n for (let i = 0; i < nContours; i++) {\n let pts = glyph.points;\n if (pts) {\n pts[nPoints[i] - 1].endContour = true;\n }\n }\n\n read255UInt16(table.glyphs);\n } else if (nContours < 0) { // composite glyph\n let haveInstructions = TTFGlyph.prototype._decodeComposite.call(\n /** @type {TTFGlyph} */ (/** @type {unknown} */ ({ _font: this })),\n /** @type {DecodedGlyf} */ (glyph),\n table.composites\n );\n if (haveInstructions) {\n read255UInt16(table.glyphs);\n }\n }\n\n glyphs.push(glyph);\n }\n\n this._transformedGlyphs = glyphs;\n }\n}\n\n/**\n * @typedef {{\n * version: number,\n * numGlyphs: number,\n * nContours: DecodeStream,\n * nPoints: DecodeStream,\n * flags: DecodeStream,\n * glyphs: DecodeStream,\n * composites: DecodeStream\n * }} GlyfTableDecoded\n */\n\n// Special class that accepts a length and returns a sub-stream for that data\nclass Substream {\n /**\n * @param {number | string} length\n */\n constructor(length) {\n this.length = length;\n this._buf = new r.Buffer(length);\n }\n\n /**\n * @param {DecodeStream} stream\n * @param {StructValue} parent\n * @returns {DecodeStream}\n */\n decode(stream, parent) {\n return new r.DecodeStream(this._buf.decode(stream, parent));\n }\n}\n\n// This struct represents the entire glyf table\nlet GlyfTable = new r.Struct({\n version: r.uint32,\n numGlyphs: r.uint16,\n indexFormat: r.uint16,\n nContourStreamSize: r.uint32,\n nPointsStreamSize: r.uint32,\n flagStreamSize: r.uint32,\n glyphStreamSize: r.uint32,\n compositeStreamSize: r.uint32,\n bboxStreamSize: r.uint32,\n instructionStreamSize: r.uint32,\n nContours: new Substream('nContourStreamSize'),\n nPoints: new Substream('nPointsStreamSize'),\n flags: new Substream('flagStreamSize'),\n glyphs: new Substream('glyphStreamSize'),\n composites: new Substream('compositeStreamSize'),\n bboxes: new Substream('bboxStreamSize'),\n instructions: new Substream('instructionStreamSize')\n});\n\nconst WORD_CODE = 253;\nconst ONE_MORE_BYTE_CODE2 = 254;\nconst ONE_MORE_BYTE_CODE1 = 255;\nconst LOWEST_U_CODE = 253;\n\n/**\n * @param {DecodeStream} stream\n * @returns {number}\n */\nfunction read255UInt16(stream) {\n let code = stream.readUInt8();\n\n if (code === WORD_CODE) {\n return stream.readUInt16BE();\n }\n\n if (code === ONE_MORE_BYTE_CODE1) {\n return stream.readUInt8() + LOWEST_U_CODE;\n }\n\n if (code === ONE_MORE_BYTE_CODE2) {\n return stream.readUInt8() + LOWEST_U_CODE * 2;\n }\n\n return code;\n}\n\n/**\n * @param {number} flag\n * @param {number} baseval\n * @returns {number}\n */\nfunction withSign(flag, baseval) {\n return flag & 1 ? baseval : -baseval;\n}\n\n/**\n * @param {DecodeStream} flags\n * @param {DecodeStream} glyphs\n * @param {number} nPoints\n * @returns {Point[]}\n */\nfunction decodeTriplet(flags, glyphs, nPoints) {\n let y;\n let x = y = 0;\n /** @type {Point[]} */\n let res = [];\n\n for (let i = 0; i < nPoints; i++) {\n let dx = 0;\n let dy = 0;\n let flag = flags.readUInt8();\n let onCurve = !(flag >> 7);\n flag &= 0x7f;\n\n if (flag < 10) {\n dx = 0;\n dy = withSign(flag, ((flag & 14) << 7) + glyphs.readUInt8());\n } else if (flag < 20) {\n dx = withSign(flag, (((flag - 10) & 14) << 7) + glyphs.readUInt8());\n dy = 0;\n } else if (flag < 84) {\n let b0 = flag - 20;\n let b1 = glyphs.readUInt8();\n dx = withSign(flag, 1 + (b0 & 0x30) + (b1 >> 4));\n dy = withSign(flag >> 1, 1 + ((b0 & 0x0c) << 2) + (b1 & 0x0f));\n } else if (flag < 120) {\n let b0 = flag - 84;\n dx = withSign(flag, 1 + ((b0 / 12) << 8) + glyphs.readUInt8());\n dy = withSign(flag >> 1, 1 + (((b0 % 12) >> 2) << 8) + glyphs.readUInt8());\n } else if (flag < 124) {\n let b1 = glyphs.readUInt8();\n let b2 = glyphs.readUInt8();\n dx = withSign(flag, (b1 << 4) + (b2 >> 4));\n dy = withSign(flag >> 1, ((b2 & 0x0f) << 8) + glyphs.readUInt8());\n } else {\n dx = withSign(flag, glyphs.readUInt16BE());\n dy = withSign(flag >> 1, glyphs.readUInt16BE());\n }\n\n x += dx;\n y += dy;\n res.push(new Point(onCurve, false, x, y));\n }\n\n return res;\n}\n", "import TTFGlyph, { Point } from './TTFGlyph';\nimport BBox from './BBox';\n\n/** @typedef {import('../../types/fontkit').DecodedGlyf} DecodedGlyf */\n/** @typedef {import('../../types/fontkit').GlyphComponent} GlyphComponent */\n\n/**\n * Represents a TrueType glyph in the WOFF2 format, which compresses glyphs differently.\n */\nexport default class WOFF2Glyph extends TTFGlyph {\n type = 'WOFF2';\n\n /**\n * @returns {DecodedGlyf | null}\n */\n _decode() {\n let cached = this._font._transformedGlyphs?.[this.id];\n if (!cached) {\n return null;\n }\n\n if (!this._font._variationProcessor) {\n // Non-variable path: return the pre-decoded glyph without copying.\n return /** @type {DecodedGlyf} */ (cached);\n }\n\n // Clone so per-instance deltas do not mutate the shared transformed cache.\n // Transformed glyf has no per-glyph bbox; zeros keep phantom-point math\n // aligned with hmtx (same approach as a missing bbox bitmap entry).\n /** @type {DecodedGlyf} */\n let glyph = {\n numberOfContours: cached.numberOfContours,\n xMin: 0,\n yMin: 0,\n xMax: 0,\n yMax: 0\n };\n\n if (cached.points) {\n glyph.points = cached.points.map((p) => {\n if (typeof p.copy === 'function') {\n return p.copy();\n }\n return new Point(p.onCurve, p.endContour, p.x, p.y);\n });\n let points = glyph.points.concat(this._getPhantomPoints(glyph));\n this._font._variationProcessor.transformPoints(this.id, points);\n glyph.phantomPoints = points.slice(-4);\n }\n\n if (cached.components) {\n glyph.components = cached.components.map((c) => {\n /** @type {GlyphComponent} */\n let clone = Object.assign(Object.create(Object.getPrototypeOf(c)), c);\n return clone;\n });\n\n /** @type {Point[]} */\n let points = [];\n for (let component of glyph.components) {\n points.push(new Point(true, true, component.dx, component.dy));\n }\n points.push(...this._getPhantomPoints(glyph));\n\n this._font._variationProcessor.transformPoints(this.id, points);\n glyph.phantomPoints = points.splice(-4, 4);\n\n for (let i = 0; i < points.length; i++) {\n glyph.components[i].dx = points[i].x;\n glyph.components[i].dy = points[i].y;\n }\n }\n\n return glyph;\n }\n\n /**\n * @param {boolean} [internal]\n * @returns {BBox}\n */\n _getCBox(internal) {\n // Avoid path recursion while building phantom points during variation decode.\n if (internal) {\n return new BBox(0, 0, 0, 0);\n }\n\n return this.path.bbox;\n }\n}\n", "import * as r from 'restructure';\n\n/** @typedef {import('restructure').BaseType} BaseType */\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('../../types/fontkit').TableEntry} TableEntry */\n\n/**\n * WOFF2 variable-length unsigned integer (Base128).\n * @type {BaseType}\n */\nconst Base128 = {\n /**\n * @param {DecodeStream} stream\n * @returns {number}\n */\n decode(stream) {\n let result = 0;\n let iterable = [0, 1, 2, 3, 4];\n for (let j = 0; j < iterable.length; j++) {\n let code = stream.readUInt8();\n\n // If any of the top seven bits are set then we're about to overflow.\n if (result & 0xe0000000) {\n throw new Error('Overflow');\n }\n\n result = (result << 7) | (code & 0x7f);\n if ((code & 0x80) === 0) {\n return result;\n }\n }\n\n throw new Error('Bad base 128 number');\n }\n};\n\nlet knownTags = [\n 'cmap', 'head', 'hhea', 'hmtx', 'maxp', 'name', 'OS/2', 'post', 'cvt ',\n 'fpgm', 'glyf', 'loca', 'prep', 'CFF ', 'VORG', 'EBDT', 'EBLC', 'gasp',\n 'hdmx', 'kern', 'LTSH', 'PCLT', 'VDMX', 'vhea', 'vmtx', 'BASE', 'GDEF',\n 'GPOS', 'GSUB', 'EBSC', 'JSTF', 'MATH', 'CBDT', 'CBLC', 'COLR', 'CPAL',\n 'SVG ', 'sbix', 'acnt', 'avar', 'bdat', 'bloc', 'bsln', 'cvar', 'fdsc',\n 'feat', 'fmtx', 'fvar', 'gvar', 'hsty', 'just', 'lcar', 'mort', 'morx',\n 'opbd', 'prop', 'trak', 'Zapf', 'Silf', 'Glat', 'Gloc', 'Feat', 'Sill'\n];\n\nlet WOFF2DirectoryEntry = new r.Struct({\n flags: r.uint8,\n customTag: new r.Optional(\n new r.String(4),\n /** @param {StructValue} t @returns {boolean} */\n t => (/** @type {number} */ (t.flags) & 0x3f) === 0x3f\n ),\n /**\n * @param {StructValue} t\n * @returns {string}\n */\n tag: (t) => {\n let flags = /** @type {number} */ (t.flags);\n return /** @type {string} */ (t.customTag) || knownTags[flags & 0x3f];\n },\n length: Base128,\n /**\n * @param {StructValue} t\n * @returns {number}\n */\n transformVersion: t => (/** @type {number} */ (t.flags) >>> 6) & 0x03,\n /**\n * @param {StructValue} t\n * @returns {boolean}\n */\n transformed: t => (t.tag === 'glyf' || t.tag === 'loca')\n ? t.transformVersion === 0\n : t.transformVersion !== 0,\n transformLength: new r.Optional(\n Base128,\n /** @param {StructValue} t @returns {boolean} */\n t => !!t.transformed\n )\n});\n\n/**\n * @typedef {StructValue & {\n * tables: TableEntry[] | Record<string, TableEntry>\n * }} WOFF2DirectoryValue\n */\n\n/** @type {import('restructure').Struct} */\nlet WOFF2Directory = new r.Struct({\n tag: new r.String(4), // should be 'wOF2'\n flavor: r.uint32,\n length: r.uint32,\n numTables: r.uint16,\n reserved: new r.Reserved(r.uint16),\n totalSfntSize: r.uint32,\n totalCompressedSize: r.uint32,\n majorVersion: r.uint16,\n minorVersion: r.uint16,\n metaOffset: r.uint32,\n metaLength: r.uint32,\n metaOrigLength: r.uint32,\n privOffset: r.uint32,\n privLength: r.uint32,\n tables: new r.Array(WOFF2DirectoryEntry, 'numTables')\n});\n\nWOFF2Directory.process = function () {\n let self = /** @type {WOFF2DirectoryValue} */ (this);\n /** @type {Record<string, TableEntry>} */\n let tables = {};\n let list = /** @type {TableEntry[]} */ (self.tables);\n for (let i = 0; i < list.length; i++) {\n let table = list[i];\n tables[table.tag] = table;\n }\n\n self.tables = tables;\n};\n\nexport default WOFF2Directory;\n", "import * as r from 'restructure';\nimport TTFFont from './TTFFont';\nimport { asciiDecoder } from './utils';\n\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('restructure').BinaryBuffer} BinaryBuffer */\n/** @typedef {import('../types/fontkit').NameString} NameString */\n\n/**\n * @param {NameString | null | undefined} a\n * @param {string | Uint8Array} b\n * @returns {boolean}\n */\nfunction postscriptNamesEqual(a, b) {\n if (a === b) {\n return true;\n }\n if (a instanceof Uint8Array && b instanceof Uint8Array) {\n return a.length === b.length && a.every((v, i) => b[i] === v);\n }\n return false;\n}\n\nlet TTCHeader = new r.VersionedStruct(r.uint32, {\n 0x00010000: {\n numFonts: r.uint32,\n offsets: new r.Array(r.uint32, 'numFonts')\n },\n 0x00020000: {\n numFonts: r.uint32,\n offsets: new r.Array(r.uint32, 'numFonts'),\n dsigTag: r.uint32,\n dsigLength: r.uint32,\n dsigOffset: r.uint32\n }\n});\n\n/**\n * @typedef {StructValue & { offsets: number[] }} TTCHeaderValue\n */\n\nexport default class TrueTypeCollection {\n /** @type {string} */\n type = 'TTC';\n\n /** @type {DecodeStream} */\n stream;\n /** @type {TTCHeaderValue} */\n header;\n\n /**\n * @param {ArrayBufferView} buffer\n * @returns {boolean}\n */\n static probe(buffer) {\n let bytes\n = buffer instanceof Uint8Array\n ? buffer\n : new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);\n return asciiDecoder.decode(bytes.subarray(0, 4)) === 'ttcf';\n }\n\n /**\n * @param {DecodeStream} stream\n */\n constructor(stream) {\n this.stream = stream;\n if (stream.readString(4) !== 'ttcf') {\n throw new Error('Not a TrueType collection');\n }\n\n this.header = /** @type {TTCHeaderValue} */ (\n /** @type {unknown} */ (TTCHeader.decode(stream))\n );\n }\n\n /**\n * @param {string | Uint8Array} name\n * @returns {TTFFont | null}\n */\n getFont(name) {\n for (let offset of this.header.offsets) {\n let stream = new r.DecodeStream(this.stream.buffer);\n stream.pos = offset;\n let font = new TTFFont(stream);\n if (postscriptNamesEqual(font.postscriptName, name)) {\n return font;\n }\n }\n\n return null;\n }\n\n /**\n * @type {TTFFont[]}\n */\n get fonts() {\n /** @type {TTFFont[]} */\n let fonts = [];\n for (let offset of this.header.offsets) {\n let stream = new r.DecodeStream(this.stream.buffer);\n stream.pos = offset;\n fonts.push(new TTFFont(stream));\n }\n\n return fonts;\n }\n}\n", "import * as r from 'restructure';\nimport TTFFont from './TTFFont';\n\n/** @typedef {import('restructure').DecodeStream} DecodeStream */\n/** @typedef {import('restructure').StructValue} StructValue */\n/** @typedef {import('restructure').BinaryBuffer} BinaryBuffer */\n/** @typedef {import('../types/fontkit').NameString} NameString */\n\n/**\n * @param {NameString | null | undefined} a\n * @param {string | Uint8Array} b\n * @returns {boolean}\n */\nfunction postscriptNamesEqual(a, b) {\n if (a === b) {\n return true;\n }\n if (a instanceof Uint8Array && b instanceof Uint8Array) {\n return a.length === b.length && a.every((v, i) => b[i] === v);\n }\n return false;\n}\n\n/**\n * @typedef {StructValue & {\n * id: number,\n * nameOffset: number,\n * attr: number,\n * dataOffset: number,\n * handle: number,\n * name?: string | null\n * }} DFontRef\n */\n\n/**\n * @typedef {StructValue & {\n * name: string,\n * maxTypeIndex: number,\n * refList: DFontRef[]\n * }} DFontType\n */\n\n/**\n * @typedef {StructValue & {\n * length: number,\n * types: DFontType[]\n * }} DFontTypeList\n */\n\n/**\n * @typedef {StructValue & {\n * typeList: DFontTypeList,\n * nameListOffset: number\n * }} DFontMap\n */\n\n/**\n * @typedef {StructValue & {\n * dataOffset: number,\n * map: DFontMap,\n * dataLength: number,\n * mapLength: number\n * }} DFontHeaderValue\n */\n\nlet DFontName = new r.String(r.uint8);\n\nlet Ref = new r.Struct({\n id: r.uint16,\n nameOffset: r.int16,\n attr: r.uint8,\n dataOffset: r.uint24,\n handle: r.uint32\n});\n\nlet Type = new r.Struct({\n name: new r.String(4),\n maxTypeIndex: r.uint16,\n refList: new r.Pointer(\n r.uint16,\n new r.Array(Ref, t => /** @type {DFontType} */ (t).maxTypeIndex + 1),\n { type: 'parent' }\n )\n});\n\nlet TypeList = new r.Struct({\n length: r.uint16,\n types: new r.Array(Type, t => /** @type {DFontTypeList} */ (t).length + 1)\n});\n\nlet DFontMap = new r.Struct({\n reserved: new r.Reserved(r.uint8, 24),\n typeList: new r.Pointer(r.uint16, TypeList),\n nameListOffset: new r.Pointer(r.uint16, 'void')\n});\n\nlet DFontHeader = new r.Struct({\n dataOffset: r.uint32,\n map: new r.Pointer(r.uint32, DFontMap),\n dataLength: r.uint32,\n mapLength: r.uint32\n});\n\nexport default class DFont {\n /** @type {string} */\n type = 'DFont';\n\n /** @type {DecodeStream} */\n stream;\n /** @type {DFontHeaderValue} */\n header;\n /** @type {DFontType | undefined} */\n sfnt;\n\n /**\n * @param {BinaryBuffer | Uint8Array} buffer\n * @returns {boolean}\n */\n static probe(buffer) {\n let stream = new r.DecodeStream(buffer);\n\n try {\n var header = /** @type {DFontHeaderValue} */ (\n /** @type {unknown} */ (DFontHeader.decode(stream))\n );\n } catch (e) {\n return false;\n }\n\n for (let type of header.map.typeList.types) {\n if (type.name === 'sfnt') {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * @param {DecodeStream} stream\n */\n constructor(stream) {\n this.stream = stream;\n this.header = /** @type {DFontHeaderValue} */ (\n /** @type {unknown} */ (DFontHeader.decode(this.stream))\n );\n\n for (let type of this.header.map.typeList.types) {\n for (let ref of type.refList) {\n if (ref.nameOffset >= 0) {\n this.stream.pos = ref.nameOffset + this.header.map.nameListOffset;\n ref.name = DFontName.decode(this.stream);\n } else {\n ref.name = null;\n }\n }\n\n if (type.name === 'sfnt') {\n this.sfnt = type;\n }\n }\n }\n\n /**\n * @param {string | Uint8Array} name\n * @returns {TTFFont | null}\n */\n getFont(name) {\n if (!this.sfnt) {\n return null;\n }\n\n for (let ref of this.sfnt.refList) {\n let pos = this.header.dataOffset + ref.dataOffset + 4;\n let buf = this.stream.buffer;\n let bytes\n = buf instanceof Uint8Array\n ? buf\n : new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n let stream = new r.DecodeStream(bytes.subarray(pos));\n let font = new TTFFont(stream);\n if (postscriptNamesEqual(font.postscriptName, name)) {\n return font;\n }\n }\n\n return null;\n }\n\n /**\n * @type {TTFFont[]}\n */\n get fonts() {\n /** @type {TTFFont[]} */\n let fonts = [];\n if (!this.sfnt) {\n return fonts;\n }\n\n for (let ref of this.sfnt.refList) {\n let pos = this.header.dataOffset + ref.dataOffset + 4;\n let buf = this.stream.buffer;\n let bytes\n = buf instanceof Uint8Array\n ? buf\n : new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n let stream = new r.DecodeStream(bytes.subarray(pos));\n fonts.push(new TTFFont(stream));\n }\n\n return fonts;\n }\n}\n"],
|
|
5
|
+
"mappings": "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AA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAK;AAAA;AAAA,QAE7D;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA;AAAA,QAE7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA;AAAA;AAAA,QAG7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA;AAAA,QAE7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA;AAAA,QAE7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA;AAAA,QAE7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA;AAAA,QAE5C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC9C;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA;AAAA,QAE3D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC3D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC3D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC3D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA;AAAA,QAE3D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAG;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAC5D;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA,QAAI;AAAA;AAAA,QAE5D;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAAA,QAC7C;AAAA,QAAG;AAAA,QAAG;AAAA,QAAG;AAA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C,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,IAAG,IAAG,KAAI,GAAE,IAAG,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,KAAI,GAAE,KAAI,GAAE,IAAG,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,KAAI,IAAG,KAAI,KAAI,KAAI,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,IAAG,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,KAAI,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,KAAI,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,KAAI,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,KAAI,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,KAAI,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,KAAI,GAAE,KAAI,GAAE,KAAI,KAAI,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,KAAI,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,KAAI,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,KAAI,KAAI,KAAI,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,KAAI,GAAE,GAAE,IAAG,CAAC,CAAC,GAAE,WAAY,CAAC,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,OAAM,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,OAAM,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,OAAM,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,OAAM,OAAM,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,OAAM,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,OAAM,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,OAAM,OAAM,MAAK,OAAM,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,OAAM,OAAM,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,OAAM,OAAM,OAAM,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,OAAM,OAAM,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,OAAM,OAAM,OAAM,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,OAAM,OAAM,OAAM,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,OAAM,OAAM,OAAM,OAAM,OAAM,OAAM,OAAM,MAAK,MAAK,OAAM,OAAM,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,OAAM,OAAM,OAAM,OAAM,MAAK,MAAK,OAAM,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,OAAM,OAAM,OAAM,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,MAAK,MAAK,MAAK,OAAM,MAAK,MAAK,OAAM,MAAK,MAAK,IAAI,GAAE,MAAO,CAAC,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,oBAAoB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,oBAAoB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,oBAAoB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,sBAAqB,gBAAgB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,oBAAoB,GAAE,CAAC,gBAAgB,GAAE,CAAC,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,gBAAgB,GAAE,CAAC,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AE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,IAAG,GAAE,IAAG,GAAE,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,CAAC,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,IAAG,IAAG,IAAG,IAAG,IAAG,IAAG,GAAE,GAAE,GAAE,IAAG,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,EAAE,GAAE,CAAC,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,GAAE,IAAG,GAAE,IAAG,CAAC,CAAC,GAAE,WAAY,CAAC,OAAM,MA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",
|
|
6
|
+
"names": ["i", "INITIAL_STATE", "FAIL_STATE", "StateMachine", "constructor", "dfa", "stateTable", "accepting", "tags", "match", "str", "self", "Symbol", "iterator", "state", "startRun", "lastAccepting", "lastState", "p", "length", "c", "apply", "actions", "start", "end", "tag", "slice", "clone", "parent", "depth", "err", "i", "i", "i", "byteLength", "i", "len", "uint8", "len2", "bits", "i", "i", "Context", "i", "x", "tables", "err", "swap", "i", "i", "ptr", "i", "i", "i", "i", "ptr", "versions", "i", "ptr", "ptr", "i", "i", "features", "langs", "i", "i", "i", "isEqual", "ptr", "i", "range", "ptr", "bits", "range", "glyph", "i", "range", "fd", "i", "i", "Axis", "shortFrac", "ClassTable", "tables", "max", "range", "i", "max", "i", "x", "i", "i", "l", "i", "isBigEndian", "i", "decodeBase64", "i", "bits", "glyph", "x", "i", "features", "direction", "x", "glyph", "i", "features", "feature", "glyph", "max", "i", "glyph", "features", "feature", "stateMachine", "glyph", "i", "g", "cache", "swap", "direction", "features", "feature", "glyph", "glyph", "direction", "feature", "i", "cache", "glyph", "range", "features", "i", "feature", "features", "i", "glyph", "trie", "data_default", "i", "feature", "glyph", "i", "glyph", "STATE_TABLE", "features", "i", "trie", "indic_default", "StateMachine", "i", "glyph", "feature", "features", "oldPos", "i", "features", "T", "T2", "import_dfa", "useDataTyped", "decompositions", "trie", "use_default", "stateMachine", "StateMachine", "setupSyllables", "i", "glyph", "nextSyllable", "glyph", "features", "i", "x", "i", "glyph", "glyph", "features", "i", "features", "direction", "glyph", "i", "x", "i", "metric", "i", "x", "loca", "glyph", "contours", "x", "i", "i", "glyph", "i", "i", "gvar", "glyph", "ON_CURVE", "X_SHORT_VECTOR", "Y_SHORT_VECTOR", "REPEAT", "SAME_X", "SAME_Y", "Point", "i", "x", "glyph", "i", "cloneDeep", "loca", "glyph", "i", "fd", "err", "direction", "glyph", "i", "tables", "glyph", "i", "tables", "i", "brotli", "glyph", "i", "x", "i", "postscriptNamesEqual", "i"]
|
|
7
|
+
}
|