becomap-v2 2.0.0-alpha.0
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/LICENSE +15 -0
- package/README.md +119 -0
- package/dist/becomap.umd.js +329 -0
- package/dist/becomap.umd.js.map +1 -0
- package/dist/index.d.ts +603 -0
- package/dist/index.js +6970 -0
- package/dist/index.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["global-externals:maplibre-gl","global-externals:three","../node_modules/protobufjs/src/util/aspromise.js","../node_modules/protobufjs/src/util/base64.js","../node_modules/protobufjs/src/util/eventemitter.js","../node_modules/protobufjs/src/util/float.js","../node_modules/protobufjs/src/util/utf8.js","../node_modules/protobufjs/src/util/pool.js","../node_modules/protobufjs/src/util/longbits.js","../node_modules/long/umd/index.js","../node_modules/protobufjs/src/util/minimal.js","../node_modules/protobufjs/src/writer.js","../node_modules/protobufjs/src/writer_buffer.js","../node_modules/protobufjs/src/reader.js","../node_modules/protobufjs/src/reader_buffer.js","../node_modules/protobufjs/src/rpc/service.js","../node_modules/protobufjs/src/rpc.js","../node_modules/protobufjs/src/roots.js","../node_modules/protobufjs/src/index-minimal.js","../node_modules/protobufjs/minimal.js","../src/index.ts","../src/beco-map.ts","../src/events.ts","../src/options.ts","../src/render/venue-renderer.ts","../src/render/coords.ts","../src/render/geometry.ts","../node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","../src/render/labels.ts","../node_modules/troika-three-text/dist/troika-three-text.esm.js","../node_modules/troika-worker-utils/dist/troika-worker-utils.esm.js","../node_modules/webgl-sdf-generator/dist/webgl-sdf-generator.mjs","../node_modules/bidi-js/dist/bidi.mjs","../node_modules/troika-three-utils/dist/troika-three-utils.esm.js","../src/render/markers.ts","../src/render/models.ts","../node_modules/three/examples/jsm/loaders/GLTFLoader.js","../src/render/polygon-theme.ts","../src/render/render-layer.ts","../src/render/route-ribbon.ts","../src/lod/floor-manager.ts","../src/ui/floor-switcher.ts","../src/interact/hit-test.ts","../src/search/index.ts","../src/routing/astar.ts","../src/routing/route-service.ts","../src/data/venue-model.ts","../src/routing/segments.ts","../src/routing/navigation.ts","../src/ui/route-bar.ts","../src/facades/index.ts","../src/data/mock-provider.ts","../src/data/gen/becomap-proto.js","../src/data/http.ts","../src/data/rest-provider.ts"],"sourcesContent":["module.exports = globalThis.maplibregl;","module.exports = globalThis.THREE;","\"use strict\";\nmodule.exports = asPromise;\n\n/**\n * Callback as used by {@link util.asPromise}.\n * @typedef asPromiseCallback\n * @type {function}\n * @param {Error|null} error Error, if any\n * @param {...*} params Additional arguments\n * @returns {undefined}\n */\n\n/**\n * Returns a promise from a node-style callback function.\n * @memberof util\n * @param {asPromiseCallback} fn Function to call\n * @param {*} ctx Function context\n * @param {...*} params Function arguments\n * @returns {Promise<*>} Promisified function\n */\nfunction asPromise(fn, ctx/*, varargs */) {\n var params = new Array(arguments.length - 1),\n offset = 0,\n index = 2,\n pending = true;\n while (index < arguments.length)\n params[offset++] = arguments[index++];\n return new Promise(function executor(resolve, reject) {\n params[offset] = function callback(err/*, varargs */) {\n if (pending) {\n pending = false;\n if (err)\n reject(err);\n else {\n var params = new Array(arguments.length - 1),\n offset = 0;\n while (offset < params.length)\n params[offset++] = arguments[offset];\n resolve.apply(null, params);\n }\n }\n };\n try {\n fn.apply(ctx || null, params);\n } catch (err) {\n if (pending) {\n pending = false;\n reject(err);\n }\n }\n });\n}\n","\"use strict\";\n\n/**\n * A minimal base64 implementation for number arrays.\n * @memberof util\n * @namespace\n */\nvar base64 = exports;\n\n/**\n * Calculates the byte length of a base64 encoded string.\n * @param {string} string Base64 encoded string\n * @returns {number} Byte length\n */\nbase64.length = function length(string) {\n var p = string.length;\n if (!p)\n return 0;\n while (p > 0 && string.charAt(p - 1) === \"=\")\n --p;\n return Math.floor(p * 3 / 4);\n};\n\n// Base64 encoding table\nvar b64 = new Array(64);\n\n// Base64 decoding table\nvar s64 = new Array(123);\n\n// 65..90, 97..122, 48..57, 43, 47\nfor (var i = 0; i < 64;)\n s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\n\ns64[45] = 62; // - -> +\ns64[95] = 63; // _ -> /\n\n/**\n * Encodes a buffer to a base64 encoded string.\n * @param {Uint8Array} buffer Source buffer\n * @param {number} start Source start\n * @param {number} end Source end\n * @returns {string} Base64 encoded string\n */\nbase64.encode = function encode(buffer, start, end) {\n var parts = null,\n chunk = [];\n var i = 0, // output index\n j = 0, // goto index\n t; // temporary\n while (start < end) {\n var b = buffer[start++];\n switch (j) {\n case 0:\n chunk[i++] = b64[b >> 2];\n t = (b & 3) << 4;\n j = 1;\n break;\n case 1:\n chunk[i++] = b64[t | b >> 4];\n t = (b & 15) << 2;\n j = 2;\n break;\n case 2:\n chunk[i++] = b64[t | b >> 6];\n chunk[i++] = b64[b & 63];\n j = 0;\n break;\n }\n if (i > 8191) {\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\n i = 0;\n }\n }\n if (j) {\n chunk[i++] = b64[t];\n chunk[i++] = 61;\n if (j === 1)\n chunk[i++] = 61;\n }\n if (parts) {\n if (i)\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\n return parts.join(\"\");\n }\n return String.fromCharCode.apply(String, chunk.slice(0, i));\n};\n\nvar invalidEncoding = \"invalid encoding\";\n\n/**\n * Decodes a base64 encoded string to a buffer.\n * @param {string} string Source string\n * @param {Uint8Array} buffer Destination buffer\n * @param {number} offset Destination offset\n * @returns {number} Number of bytes written\n * @throws {Error} If encoding is invalid\n */\nbase64.decode = function decode(string, buffer, offset) {\n var start = offset;\n var j = 0, // goto index\n t; // temporary\n for (var i = 0; i < string.length;) {\n var c = string.charCodeAt(i++);\n if (c === 61 && j > 1)\n break;\n if ((c = s64[c]) === undefined)\n throw Error(invalidEncoding);\n switch (j) {\n case 0:\n t = c;\n j = 1;\n break;\n case 1:\n buffer[offset++] = t << 2 | (c & 48) >> 4;\n t = c;\n j = 2;\n break;\n case 2:\n buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2;\n t = c;\n j = 3;\n break;\n case 3:\n buffer[offset++] = (t & 3) << 6 | c;\n j = 0;\n break;\n }\n }\n if (j === 1)\n throw Error(invalidEncoding);\n return offset - start;\n};\n\nvar base64Re = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,\n base64UrlRe = /[-_]/,\n base64UrlNoPaddingRe = /^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-]{2}(?:==)?|[A-Za-z0-9_-]{3}=?)?$/;\n\n/**\n * Tests if the specified string appears to be base64 encoded.\n * @param {string} string String to test\n * @returns {boolean} `true` if probably base64 encoded, otherwise false\n */\nbase64.test = function test(string) {\n return base64Re.test(string)\n || base64UrlRe.test(string) && base64UrlNoPaddingRe.test(string);\n};\n","\"use strict\";\nmodule.exports = EventEmitter;\n\n/**\n * Constructs a new event emitter instance.\n * @classdesc A minimal event emitter.\n * @memberof util\n * @constructor\n */\nfunction EventEmitter() {\n\n /**\n * Registered listeners.\n * @type {Object.<string,*>}\n * @private\n */\n this._listeners = Object.create(null);\n}\n\n/**\n * Event listener as used by {@link util.EventEmitter}.\n * @typedef EventEmitterListener\n * @type {function}\n * @param {...*} args Arguments\n * @returns {undefined}\n */\n\n/**\n * Registers an event listener.\n * @param {string} evt Event name\n * @param {EventEmitterListener} fn Listener\n * @param {*} [ctx] Listener context\n * @returns {this} `this`\n */\nEventEmitter.prototype.on = function on(evt, fn, ctx) {\n (this._listeners[evt] || (this._listeners[evt] = [])).push({\n fn : fn,\n ctx : ctx || this\n });\n return this;\n};\n\n/**\n * Removes an event listener or any matching listeners if arguments are omitted.\n * @param {string} [evt] Event name. Removes all listeners if omitted.\n * @param {EventEmitterListener} [fn] Listener to remove. Removes all listeners of `evt` if omitted.\n * @returns {this} `this`\n */\nEventEmitter.prototype.off = function off(evt, fn) {\n if (evt === undefined)\n this._listeners = Object.create(null);\n else {\n if (fn === undefined)\n this._listeners[evt] = [];\n else {\n var listeners = this._listeners[evt];\n if (!listeners)\n return this;\n for (var i = 0; i < listeners.length;)\n if (listeners[i].fn === fn)\n listeners.splice(i, 1);\n else\n ++i;\n }\n }\n return this;\n};\n\n/**\n * Emits an event by calling its listeners with the specified arguments.\n * @param {string} evt Event name\n * @param {...*} args Arguments\n * @returns {this} `this`\n */\nEventEmitter.prototype.emit = function emit(evt) {\n var listeners = this._listeners[evt];\n if (listeners) {\n var args = [],\n i = 1;\n for (; i < arguments.length;)\n args.push(arguments[i++]);\n for (i = 0; i < listeners.length;)\n listeners[i].fn.apply(listeners[i++].ctx, args);\n }\n return this;\n};\n","\"use strict\";\n\nmodule.exports = factory(factory);\n\n/**\n * Reads / writes floats / doubles from / to buffers.\n * @name util.float\n * @namespace\n */\n\n/**\n * Writes a 32 bit float to a buffer using little endian byte order.\n * @name util.float.writeFloatLE\n * @function\n * @param {number} val Value to write\n * @param {Uint8Array} buf Target buffer\n * @param {number} pos Target buffer offset\n * @returns {undefined}\n */\n\n/**\n * Writes a 32 bit float to a buffer using big endian byte order.\n * @name util.float.writeFloatBE\n * @function\n * @param {number} val Value to write\n * @param {Uint8Array} buf Target buffer\n * @param {number} pos Target buffer offset\n * @returns {undefined}\n */\n\n/**\n * Reads a 32 bit float from a buffer using little endian byte order.\n * @name util.float.readFloatLE\n * @function\n * @param {Uint8Array} buf Source buffer\n * @param {number} pos Source buffer offset\n * @returns {number} Value read\n */\n\n/**\n * Reads a 32 bit float from a buffer using big endian byte order.\n * @name util.float.readFloatBE\n * @function\n * @param {Uint8Array} buf Source buffer\n * @param {number} pos Source buffer offset\n * @returns {number} Value read\n */\n\n/**\n * Writes a 64 bit double to a buffer using little endian byte order.\n * @name util.float.writeDoubleLE\n * @function\n * @param {number} val Value to write\n * @param {Uint8Array} buf Target buffer\n * @param {number} pos Target buffer offset\n * @returns {undefined}\n */\n\n/**\n * Writes a 64 bit double to a buffer using big endian byte order.\n * @name util.float.writeDoubleBE\n * @function\n * @param {number} val Value to write\n * @param {Uint8Array} buf Target buffer\n * @param {number} pos Target buffer offset\n * @returns {undefined}\n */\n\n/**\n * Reads a 64 bit double from a buffer using little endian byte order.\n * @name util.float.readDoubleLE\n * @function\n * @param {Uint8Array} buf Source buffer\n * @param {number} pos Source buffer offset\n * @returns {number} Value read\n */\n\n/**\n * Reads a 64 bit double from a buffer using big endian byte order.\n * @name util.float.readDoubleBE\n * @function\n * @param {Uint8Array} buf Source buffer\n * @param {number} pos Source buffer offset\n * @returns {number} Value read\n */\n\n// Factory function for the purpose of node-based testing in modified global environments\nfunction factory(exports) {\n\n // float: typed array\n if (typeof Float32Array !== \"undefined\") (function() {\n\n var f32 = new Float32Array([ -0 ]),\n f8b = new Uint8Array(f32.buffer),\n le = f8b[3] === 128;\n\n function writeFloat_f32_cpy(val, buf, pos) {\n f32[0] = val;\n buf[pos ] = f8b[0];\n buf[pos + 1] = f8b[1];\n buf[pos + 2] = f8b[2];\n buf[pos + 3] = f8b[3];\n }\n\n function writeFloat_f32_rev(val, buf, pos) {\n f32[0] = val;\n buf[pos ] = f8b[3];\n buf[pos + 1] = f8b[2];\n buf[pos + 2] = f8b[1];\n buf[pos + 3] = f8b[0];\n }\n\n /* istanbul ignore next */\n exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev;\n /* istanbul ignore next */\n exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy;\n\n function readFloat_f32_cpy(buf, pos) {\n f8b[0] = buf[pos ];\n f8b[1] = buf[pos + 1];\n f8b[2] = buf[pos + 2];\n f8b[3] = buf[pos + 3];\n return f32[0];\n }\n\n function readFloat_f32_rev(buf, pos) {\n f8b[3] = buf[pos ];\n f8b[2] = buf[pos + 1];\n f8b[1] = buf[pos + 2];\n f8b[0] = buf[pos + 3];\n return f32[0];\n }\n\n /* istanbul ignore next */\n exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev;\n /* istanbul ignore next */\n exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy;\n\n // float: ieee754\n })(); else (function() {\n\n function writeFloat_ieee754(writeUint, val, buf, pos) {\n var sign = val < 0 ? 1 : 0;\n if (sign)\n val = -val;\n if (val === 0)\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos);\n else if (isNaN(val))\n writeUint(2143289344, buf, pos);\n else if (val > 3.4028234663852886e+38) // +-Infinity\n writeUint((sign << 31 | 2139095040) >>> 0, buf, pos);\n else if (val < 1.1754943508222875e-38) // denormal\n writeUint((sign << 31 | Math.round(val / 1.401298464324817e-45)) >>> 0, buf, pos);\n else {\n var exponent = Math.floor(Math.log(val) / Math.LN2),\n mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607;\n writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos);\n }\n }\n\n exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE);\n exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE);\n\n function readFloat_ieee754(readUint, buf, pos) {\n var uint = readUint(buf, pos),\n sign = (uint >> 31) * 2 + 1,\n exponent = uint >>> 23 & 255,\n mantissa = uint & 8388607;\n return exponent === 255\n ? mantissa\n ? NaN\n : sign * Infinity\n : exponent === 0 // denormal\n ? sign * 1.401298464324817e-45 * mantissa\n : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608);\n }\n\n exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE);\n exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE);\n\n })();\n\n // double: typed array\n if (typeof Float64Array !== \"undefined\") (function() {\n\n var f64 = new Float64Array([-0]),\n f8b = new Uint8Array(f64.buffer),\n le = f8b[7] === 128;\n\n function writeDouble_f64_cpy(val, buf, pos) {\n f64[0] = val;\n buf[pos ] = f8b[0];\n buf[pos + 1] = f8b[1];\n buf[pos + 2] = f8b[2];\n buf[pos + 3] = f8b[3];\n buf[pos + 4] = f8b[4];\n buf[pos + 5] = f8b[5];\n buf[pos + 6] = f8b[6];\n buf[pos + 7] = f8b[7];\n }\n\n function writeDouble_f64_rev(val, buf, pos) {\n f64[0] = val;\n buf[pos ] = f8b[7];\n buf[pos + 1] = f8b[6];\n buf[pos + 2] = f8b[5];\n buf[pos + 3] = f8b[4];\n buf[pos + 4] = f8b[3];\n buf[pos + 5] = f8b[2];\n buf[pos + 6] = f8b[1];\n buf[pos + 7] = f8b[0];\n }\n\n /* istanbul ignore next */\n exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev;\n /* istanbul ignore next */\n exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy;\n\n function readDouble_f64_cpy(buf, pos) {\n f8b[0] = buf[pos ];\n f8b[1] = buf[pos + 1];\n f8b[2] = buf[pos + 2];\n f8b[3] = buf[pos + 3];\n f8b[4] = buf[pos + 4];\n f8b[5] = buf[pos + 5];\n f8b[6] = buf[pos + 6];\n f8b[7] = buf[pos + 7];\n return f64[0];\n }\n\n function readDouble_f64_rev(buf, pos) {\n f8b[7] = buf[pos ];\n f8b[6] = buf[pos + 1];\n f8b[5] = buf[pos + 2];\n f8b[4] = buf[pos + 3];\n f8b[3] = buf[pos + 4];\n f8b[2] = buf[pos + 5];\n f8b[1] = buf[pos + 6];\n f8b[0] = buf[pos + 7];\n return f64[0];\n }\n\n /* istanbul ignore next */\n exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev;\n /* istanbul ignore next */\n exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy;\n\n // double: ieee754\n })(); else (function() {\n\n function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) {\n var sign = val < 0 ? 1 : 0;\n if (sign)\n val = -val;\n if (val === 0) {\n writeUint(0, buf, pos + off0);\n writeUint(1 / val > 0 ? /* positive */ 0 : /* negative 0 */ 2147483648, buf, pos + off1);\n } else if (isNaN(val)) {\n writeUint(0, buf, pos + off0);\n writeUint(2146959360, buf, pos + off1);\n } else if (val > 1.7976931348623157e+308) { // +-Infinity\n writeUint(0, buf, pos + off0);\n writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1);\n } else {\n var mantissa;\n if (val < 2.2250738585072014e-308) { // denormal\n mantissa = val / 5e-324;\n writeUint(mantissa >>> 0, buf, pos + off0);\n writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1);\n } else {\n var exponent = Math.floor(Math.log(val) / Math.LN2);\n if (exponent === 1024)\n exponent = 1023;\n mantissa = val * Math.pow(2, -exponent);\n writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0);\n writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1);\n }\n }\n }\n\n exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4);\n exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0);\n\n function readDouble_ieee754(readUint, off0, off1, buf, pos) {\n var lo = readUint(buf, pos + off0),\n hi = readUint(buf, pos + off1);\n var sign = (hi >> 31) * 2 + 1,\n exponent = hi >>> 20 & 2047,\n mantissa = 4294967296 * (hi & 1048575) + lo;\n return exponent === 2047\n ? mantissa\n ? NaN\n : sign * Infinity\n : exponent === 0 // denormal\n ? sign * 5e-324 * mantissa\n : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496);\n }\n\n exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4);\n exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0);\n\n })();\n\n return exports;\n}\n\n// uint helpers\n\nfunction writeUintLE(val, buf, pos) {\n buf[pos ] = val & 255;\n buf[pos + 1] = val >>> 8 & 255;\n buf[pos + 2] = val >>> 16 & 255;\n buf[pos + 3] = val >>> 24;\n}\n\nfunction writeUintBE(val, buf, pos) {\n buf[pos ] = val >>> 24;\n buf[pos + 1] = val >>> 16 & 255;\n buf[pos + 2] = val >>> 8 & 255;\n buf[pos + 3] = val & 255;\n}\n\nfunction readUintLE(buf, pos) {\n return (buf[pos ]\n | buf[pos + 1] << 8\n | buf[pos + 2] << 16\n | buf[pos + 3] << 24) >>> 0;\n}\n\nfunction readUintBE(buf, pos) {\n return (buf[pos ] << 24\n | buf[pos + 1] << 16\n | buf[pos + 2] << 8\n | buf[pos + 3]) >>> 0;\n}\n","\"use strict\";\n\n/**\n * A minimal UTF8 implementation.\n * @memberof util\n * @namespace\n */\nvar utf8 = exports,\n replacementChar = \"\\ufffd\",\n looseDecoder = new TextDecoder(\"utf-8\", { ignoreBOM: true }),\n strictDecoder;\nvar TEXT_DECODER_MIN_LENGTH = 64;\n\ntry {\n strictDecoder = new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true });\n} catch (err) {\n // \"fatal\" option is not supported on Node.js compiled without ICU\n strictDecoder = looseDecoder;\n}\n\n/**\n * Calculates the UTF8 byte length of a string.\n * @param {string} string String\n * @returns {number} Byte length\n */\nutf8.length = function utf8_length(string) {\n var len = 0,\n c = 0;\n for (var i = 0; i < string.length; ++i) {\n c = string.charCodeAt(i);\n if (c < 128)\n len += 1;\n else if (c < 2048)\n len += 2;\n else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\n ++i;\n len += 4;\n } else\n len += 3;\n }\n return len;\n};\n\nfunction utf8_read_js(buffer, start, end, str) {\n for (var i = start; i < end;) {\n var t = buffer[i++];\n if (t <= 0x7F) {\n str += String.fromCharCode(t);\n } else if (t >= 0xC0 && t < 0xE0) {\n var c2 = (t & 0x1F) << 6 | buffer[i++] & 0x3F;\n str += c2 >= 0x80 ? String.fromCharCode(c2) : replacementChar;\n } else if (t >= 0xE0 && t < 0xF0) {\n var c3 = (t & 0xF) << 12 | (buffer[i++] & 0x3F) << 6 | buffer[i++] & 0x3F;\n str += c3 >= 0x800 ? String.fromCharCode(c3) : replacementChar;\n } else if (t >= 0xF0) {\n var t2 = (t & 7) << 18 | (buffer[i++] & 0x3F) << 12 | (buffer[i++] & 0x3F) << 6 | buffer[i++] & 0x3F;\n if (t2 < 0x10000 || t2 > 0x10FFFF)\n str += replacementChar;\n else {\n t2 -= 0x10000;\n str += String.fromCharCode(0xD800 + (t2 >> 10));\n str += String.fromCharCode(0xDC00 + (t2 & 0x3FF));\n }\n }\n }\n return str;\n}\n\nfunction utf8_read_decoder(decoder, buffer, start, end) {\n var source = start === 0 && end === buffer.length\n ? buffer\n : buffer.subarray(start, end);\n return decoder.decode(source);\n}\n\n/**\n * Reads UTF8 bytes as a string.\n * @param {Uint8Array} buffer Source buffer\n * @param {number} start Source start\n * @param {number} end Source end\n * @returns {string} String read\n */\nutf8.read = function utf8_read_loose(buffer, start, end) {\n if (end - start < 1)\n return \"\";\n if (end - start >= TEXT_DECODER_MIN_LENGTH)\n return utf8_read_decoder(looseDecoder, buffer, start, end);\n\n var str = \"\",\n i = start,\n c1, c2, c3, c4, c5, c6, c7, c8;\n\n for (; i + 7 < end; i += 8) {\n c1 = buffer[i];\n c2 = buffer[i + 1];\n c3 = buffer[i + 2];\n c4 = buffer[i + 3];\n c5 = buffer[i + 4];\n c6 = buffer[i + 5];\n c7 = buffer[i + 6];\n c8 = buffer[i + 7];\n if ((c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8) & 0x80)\n return utf8_read_js(buffer, i, end, str);\n str += String.fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8);\n }\n\n for (; i < end; ++i) {\n c1 = buffer[i];\n if (c1 & 0x80)\n return utf8_read_js(buffer, i, end, str);\n str += String.fromCharCode(c1);\n }\n\n return str;\n};\n\n/**\n * Reads UTF8 bytes as a string, rejecting invalid UTF8.\n * @param {Uint8Array} buffer Source buffer\n * @param {number} start Source start\n * @param {number} end Source end\n * @returns {string} String read\n */\nutf8.readStrict = function utf8_read_strict(buffer, start, end) {\n if (end - start < 1)\n return \"\";\n if (end - start >= TEXT_DECODER_MIN_LENGTH)\n return utf8_read_decoder(strictDecoder, buffer, start, end);\n\n var str = \"\",\n i = start,\n c1, c2, c3, c4, c5, c6, c7, c8;\n\n for (; i + 7 < end; i += 8) {\n c1 = buffer[i];\n c2 = buffer[i + 1];\n c3 = buffer[i + 2];\n c4 = buffer[i + 3];\n c5 = buffer[i + 4];\n c6 = buffer[i + 5];\n c7 = buffer[i + 6];\n c8 = buffer[i + 7];\n if ((c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8) & 0x80)\n return str + utf8_read_decoder(strictDecoder, buffer, i, end);\n str += String.fromCharCode(c1, c2, c3, c4, c5, c6, c7, c8);\n }\n\n for (; i < end; ++i) {\n c1 = buffer[i];\n if (c1 & 0x80)\n return str + utf8_read_decoder(strictDecoder, buffer, i, end);\n str += String.fromCharCode(c1);\n }\n\n return str;\n};\n\n/**\n * Writes a string as UTF8 bytes.\n * @param {string} string Source string\n * @param {Uint8Array} buffer Destination buffer\n * @param {number} offset Destination offset\n * @returns {number} Bytes written\n */\nutf8.write = function utf8_write(string, buffer, offset) {\n var start = offset,\n c1, // character 1\n c2; // character 2\n for (var i = 0; i < string.length; ++i) {\n c1 = string.charCodeAt(i);\n if (c1 < 128) {\n buffer[offset++] = c1;\n } else if (c1 < 2048) {\n buffer[offset++] = c1 >> 6 | 192;\n buffer[offset++] = c1 & 63 | 128;\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\n ++i;\n buffer[offset++] = c1 >> 18 | 240;\n buffer[offset++] = c1 >> 12 & 63 | 128;\n buffer[offset++] = c1 >> 6 & 63 | 128;\n buffer[offset++] = c1 & 63 | 128;\n } else {\n buffer[offset++] = c1 >> 12 | 224;\n buffer[offset++] = c1 >> 6 & 63 | 128;\n buffer[offset++] = c1 & 63 | 128;\n }\n }\n return offset - start;\n};\n","\"use strict\";\nmodule.exports = pool;\n\n/**\n * An allocator as used by {@link util.pool}.\n * @typedef PoolAllocator\n * @type {function}\n * @param {number} size Buffer size\n * @returns {Uint8Array} Buffer\n */\n\n/**\n * A slicer as used by {@link util.pool}.\n * @typedef PoolSlicer\n * @type {function}\n * @param {number} start Start offset\n * @param {number} end End offset\n * @returns {Uint8Array} Buffer slice\n * @this Uint8Array\n */\n\n/**\n * A general purpose buffer pool.\n * @memberof util\n * @function\n * @param {PoolAllocator} alloc Allocator\n * @param {PoolSlicer} slice Slicer\n * @param {number} [size=8192] Slab size\n * @returns {PoolAllocator} Pooled allocator\n */\nfunction pool(alloc, slice, size) {\n var SIZE = size || 8192;\n var MAX = SIZE >>> 1;\n var slab = null;\n var offset = SIZE;\n return function pool_alloc(size) {\n if (size < 1 || size > MAX)\n return alloc(size);\n if (offset + size > SIZE) {\n slab = alloc(SIZE);\n offset = 0;\n }\n var buf = slice.call(slab, offset, offset += size);\n if (offset & 7) // align to 32 bit\n offset = (offset | 7) + 1;\n return buf;\n };\n}\n","\"use strict\";\nmodule.exports = LongBits;\n\nvar Long;\n\n/**\n * Constructs new long bits.\n * @classdesc Helper class for working with the low and high bits of a 64 bit value.\n * @memberof util\n * @constructor\n * @param {number} lo Low 32 bits, unsigned\n * @param {number} hi High 32 bits, unsigned\n */\nfunction LongBits(lo, hi) {\n\n // note that the casts below are theoretically unnecessary as of today, but older statically\n // generated converter code might still call the ctor with signed 32bits. kept for compat.\n\n /**\n * Low bits.\n * @type {number}\n */\n this.lo = lo >>> 0;\n\n /**\n * High bits.\n * @type {number}\n */\n this.hi = hi >>> 0;\n}\n\n/**\n * Zero bits.\n * @memberof util.LongBits\n * @type {util.LongBits}\n */\nvar zero = LongBits.zero = new LongBits(0, 0);\n\nzero.toNumber = function() { return 0; };\nzero.zzEncode = zero.zzDecode = function() { return this; };\nzero.length = function() { return 1; };\n\n/**\n * Zero hash.\n * @memberof util.LongBits\n * @type {string}\n */\nvar zeroHash = LongBits.zeroHash = \"\\0\\0\\0\\0\\0\\0\\0\\0\";\n\n/**\n * Constructs new long bits from the specified number.\n * @param {number} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.fromNumber = function fromNumber(value) {\n if (value === 0)\n return zero;\n var sign = value < 0;\n if (sign)\n value = -value;\n var lo = value >>> 0,\n hi = (value - lo) / 4294967296 >>> 0;\n if (sign) {\n hi = ~hi >>> 0;\n lo = ~lo >>> 0;\n if (++lo > 4294967295) {\n lo = 0;\n if (++hi > 4294967295)\n hi = 0;\n }\n }\n return new LongBits(lo, hi);\n};\n\n/**\n * Constructs new long bits from a number, long or string.\n * @param {Long|number|string} value Value\n * @returns {util.LongBits} Instance\n */\nLongBits.from = function from(value) {\n if (typeof value === \"number\")\n return LongBits.fromNumber(value);\n if (typeof value === \"string\" || value instanceof String) {\n /* istanbul ignore else */\n if (Long)\n value = Long.fromString(value);\n else\n return LongBits.fromNumber(parseInt(value, 10));\n }\n return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero;\n};\n\n/**\n * Converts this long bits to a possibly unsafe JavaScript number.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {number} Possibly unsafe number\n */\nLongBits.prototype.toNumber = function toNumber(unsigned) {\n if (!unsigned && this.hi >>> 31) {\n var lo = ~this.lo + 1 >>> 0,\n hi = ~this.hi >>> 0;\n if (!lo)\n hi = hi + 1 >>> 0;\n return -(lo + hi * 4294967296);\n }\n return this.lo + this.hi * 4294967296;\n};\n\n/**\n * Converts this long bits to a long.\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long} Long\n */\nLongBits.prototype.toLong = function toLong(unsigned) {\n return Long\n ? new Long(this.lo | 0, this.hi | 0, Boolean(unsigned))\n /* istanbul ignore next */\n : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) };\n};\n\nvar charCodeAt = String.prototype.charCodeAt;\n\n/**\n * Constructs new long bits from the specified 8 characters long hash.\n * @param {string} hash Hash\n * @returns {util.LongBits} Bits\n */\nLongBits.fromHash = function fromHash(hash) {\n if (hash === zeroHash)\n return zero;\n return new LongBits(\n ( charCodeAt.call(hash, 0)\n | charCodeAt.call(hash, 1) << 8\n | charCodeAt.call(hash, 2) << 16\n | charCodeAt.call(hash, 3) << 24) >>> 0\n ,\n ( charCodeAt.call(hash, 4)\n | charCodeAt.call(hash, 5) << 8\n | charCodeAt.call(hash, 6) << 16\n | charCodeAt.call(hash, 7) << 24) >>> 0\n );\n};\n\n/**\n * Converts this long bits to a 8 characters long hash.\n * @returns {string} Hash\n */\nLongBits.prototype.toHash = function toHash() {\n return String.fromCharCode(\n this.lo & 255,\n this.lo >>> 8 & 255,\n this.lo >>> 16 & 255,\n this.lo >>> 24 ,\n this.hi & 255,\n this.hi >>> 8 & 255,\n this.hi >>> 16 & 255,\n this.hi >>> 24\n );\n};\n\n/**\n * Zig-zag encodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzEncode = function zzEncode() {\n var mask = this.hi >> 31;\n this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0;\n this.lo = ( this.lo << 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Zig-zag decodes this long bits.\n * @returns {util.LongBits} `this`\n */\nLongBits.prototype.zzDecode = function zzDecode() {\n var mask = -(this.lo & 1);\n this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0;\n this.hi = ( this.hi >>> 1 ^ mask) >>> 0;\n return this;\n};\n\n/**\n * Calculates the length of this longbits when encoded as a varint.\n * @returns {number} Length\n */\nLongBits.prototype.length = function length() {\n var part0 = this.lo,\n part1 = (this.lo >>> 28 | this.hi << 4) >>> 0,\n part2 = this.hi >>> 24;\n return part2 === 0\n ? part1 === 0\n ? part0 < 16384\n ? part0 < 128 ? 1 : 2\n : part0 < 2097152 ? 3 : 4\n : part1 < 16384\n ? part1 < 128 ? 5 : 6\n : part1 < 2097152 ? 7 : 8\n : part2 < 128 ? 9 : 10;\n};\n\nLongBits._configure = function(Long_) {\n Long = Long_;\n};\n","// GENERATED FILE. DO NOT EDIT.\n(function (global, factory) {\n function preferDefault(exports) {\n return exports.default || exports;\n }\n if (typeof define === \"function\" && define.amd) {\n define([], function () {\n var exports = {};\n factory(exports);\n return preferDefault(exports);\n });\n } else if (typeof exports === \"object\") {\n factory(exports);\n if (typeof module === \"object\") module.exports = preferDefault(exports);\n } else {\n (function () {\n var exports = {};\n factory(exports);\n global.Long = preferDefault(exports);\n })();\n }\n})(\n typeof globalThis !== \"undefined\"\n ? globalThis\n : typeof self !== \"undefined\"\n ? self\n : this,\n function (_exports) {\n \"use strict\";\n\n Object.defineProperty(_exports, \"__esModule\", {\n value: true,\n });\n _exports.default = void 0;\n /**\n * @license\n * Copyright 2009 The Closure Library Authors\n * Copyright 2020 Daniel Wirtz / The long.js Authors.\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 * SPDX-License-Identifier: Apache-2.0\n */\n\n // WebAssembly optimizations to do native i64 multiplication and divide\n var wasm = null;\n try {\n wasm = new WebAssembly.Instance(\n new WebAssembly.Module(\n new Uint8Array([\n // \\0asm\n 0, 97, 115, 109,\n // version 1\n 1, 0, 0, 0,\n // section \"type\"\n 1, 13, 2,\n // 0, () => i32\n 96, 0, 1, 127,\n // 1, (i32, i32, i32, i32) => i32\n 96, 4, 127, 127, 127, 127, 1, 127,\n // section \"function\"\n 3, 7, 6,\n // 0, type 0\n 0,\n // 1, type 1\n 1,\n // 2, type 1\n 1,\n // 3, type 1\n 1,\n // 4, type 1\n 1,\n // 5, type 1\n 1,\n // section \"global\"\n 6, 6, 1,\n // 0, \"high\", mutable i32\n 127, 1, 65, 0, 11,\n // section \"export\"\n 7, 50, 6,\n // 0, \"mul\"\n 3, 109, 117, 108, 0, 1,\n // 1, \"div_s\"\n 5, 100, 105, 118, 95, 115, 0, 2,\n // 2, \"div_u\"\n 5, 100, 105, 118, 95, 117, 0, 3,\n // 3, \"rem_s\"\n 5, 114, 101, 109, 95, 115, 0, 4,\n // 4, \"rem_u\"\n 5, 114, 101, 109, 95, 117, 0, 5,\n // 5, \"get_high\"\n 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0,\n // section \"code\"\n 10, 191, 1, 6,\n // 0, \"get_high\"\n 4, 0, 35, 0, 11,\n // 1, \"mul\"\n 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,\n 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0,\n 32, 4, 167, 11,\n // 2, \"div_s\"\n 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,\n 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0,\n 32, 4, 167, 11,\n // 3, \"div_u\"\n 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,\n 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0,\n 32, 4, 167, 11,\n // 4, \"rem_s\"\n 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,\n 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0,\n 32, 4, 167, 11,\n // 5, \"rem_u\"\n 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,\n 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0,\n 32, 4, 167, 11,\n ]),\n ),\n {},\n ).exports;\n } catch {\n // no wasm support :(\n }\n\n /**\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\n * See the from* functions below for more convenient ways of constructing Longs.\n * @exports Long\n * @class A Long class for representing a 64 bit two's-complement integer value.\n * @param {number} low The low (signed) 32 bits of the long\n * @param {number} high The high (signed) 32 bits of the long\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @constructor\n */\n function Long(low, high, unsigned) {\n /**\n * The low 32 bits as a signed value.\n * @type {number}\n */\n this.low = low | 0;\n\n /**\n * The high 32 bits as a signed value.\n * @type {number}\n */\n this.high = high | 0;\n\n /**\n * Whether unsigned or not.\n * @type {boolean}\n */\n this.unsigned = !!unsigned;\n }\n\n // The internal representation of a long is the two given signed, 32-bit values.\n // We use 32-bit pieces because these are the size of integers on which\n // Javascript performs bit-operations. For operations like addition and\n // multiplication, we split each number into 16 bit pieces, which can easily be\n // multiplied within Javascript's floating-point representation without overflow\n // or change in sign.\n //\n // In the algorithms below, we frequently reduce the negative case to the\n // positive case by negating the input(s) and then post-processing the result.\n // Note that we must ALWAYS check specially whether those values are MIN_VALUE\n // (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\n // a positive number, it overflows back into a negative). Not handling this\n // case would often result in infinite recursion.\n //\n // Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\n // methods on which they depend.\n\n /**\n * An indicator used to reliably determine if an object is a Long or not.\n * @type {boolean}\n * @const\n * @private\n */\n Long.prototype.__isLong__;\n Object.defineProperty(Long.prototype, \"__isLong__\", {\n value: true,\n });\n\n /**\n * @function\n * @param {*} obj Object\n * @returns {boolean}\n * @inner\n */\n function isLong(obj) {\n return (obj && obj[\"__isLong__\"]) === true;\n }\n\n /**\n * @function\n * @param {*} value number\n * @returns {number}\n * @inner\n */\n function ctz32(value) {\n var c = Math.clz32(value & -value);\n return value ? 31 - c : c;\n }\n\n /**\n * Tests if the specified object is a Long.\n * @function\n * @param {*} obj Object\n * @returns {boolean}\n */\n Long.isLong = isLong;\n\n /**\n * A cache of the Long representations of small integer values.\n * @type {!Object}\n * @inner\n */\n var INT_CACHE = {};\n\n /**\n * A cache of the Long representations of small unsigned integer values.\n * @type {!Object}\n * @inner\n */\n var UINT_CACHE = {};\n\n /**\n * @param {number} value\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\n function fromInt(value, unsigned) {\n var obj, cachedObj, cache;\n if (unsigned) {\n value >>>= 0;\n if ((cache = 0 <= value && value < 256)) {\n cachedObj = UINT_CACHE[value];\n if (cachedObj) return cachedObj;\n }\n obj = fromBits(value, 0, true);\n if (cache) UINT_CACHE[value] = obj;\n return obj;\n } else {\n value |= 0;\n if ((cache = -128 <= value && value < 128)) {\n cachedObj = INT_CACHE[value];\n if (cachedObj) return cachedObj;\n }\n obj = fromBits(value, value < 0 ? -1 : 0, false);\n if (cache) INT_CACHE[value] = obj;\n return obj;\n }\n }\n\n /**\n * Returns a Long representing the given 32 bit integer value.\n * @function\n * @param {number} value The 32 bit integer in question\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\n Long.fromInt = fromInt;\n\n /**\n * @param {number} value\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\n function fromNumber(value, unsigned) {\n if (isNaN(value)) return unsigned ? UZERO : ZERO;\n if (unsigned) {\n if (value < 0) return UZERO;\n if (value >= TWO_PWR_64_DBL) return MAX_UNSIGNED_VALUE;\n } else {\n if (value <= -TWO_PWR_63_DBL) return MIN_VALUE;\n if (value + 1 >= TWO_PWR_63_DBL) return MAX_VALUE;\n }\n if (value < 0) return fromNumber(-value, unsigned).neg();\n return fromBits(\n value % TWO_PWR_32_DBL | 0,\n (value / TWO_PWR_32_DBL) | 0,\n unsigned,\n );\n }\n\n /**\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\n * @function\n * @param {number} value The number in question\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\n Long.fromNumber = fromNumber;\n\n /**\n * @param {number} lowBits\n * @param {number} highBits\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\n function fromBits(lowBits, highBits, unsigned) {\n return new Long(lowBits, highBits, unsigned);\n }\n\n /**\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\n * assumed to use 32 bits.\n * @function\n * @param {number} lowBits The low 32 bits\n * @param {number} highBits The high 32 bits\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\n Long.fromBits = fromBits;\n\n /**\n * @function\n * @param {number} base\n * @param {number} exponent\n * @returns {number}\n * @inner\n */\n var pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\n\n /**\n * @param {string} str\n * @param {(boolean|number)=} unsigned\n * @param {number=} radix\n * @returns {!Long}\n * @inner\n */\n function fromString(str, unsigned, radix) {\n if (str.length === 0) throw Error(\"empty string\");\n if (typeof unsigned === \"number\") {\n // For goog.math.long compatibility\n radix = unsigned;\n unsigned = false;\n } else {\n unsigned = !!unsigned;\n }\n if (\n str === \"NaN\" ||\n str === \"Infinity\" ||\n str === \"+Infinity\" ||\n str === \"-Infinity\"\n )\n return unsigned ? UZERO : ZERO;\n radix = radix || 10;\n if (radix < 2 || 36 < radix) throw RangeError(\"radix\");\n var p;\n if ((p = str.indexOf(\"-\")) > 0) throw Error(\"interior hyphen\");\n else if (p === 0) {\n return fromString(str.substring(1), unsigned, radix).neg();\n }\n\n // Do several (8) digits each time through the loop, so as to\n // minimize the calls to the very expensive emulated div.\n var radixToPower = fromNumber(pow_dbl(radix, 8));\n var result = ZERO;\n for (var i = 0; i < str.length; i += 8) {\n var size = Math.min(8, str.length - i),\n value = parseInt(str.substring(i, i + size), radix);\n if (size < 8) {\n var power = fromNumber(pow_dbl(radix, size));\n result = result.mul(power).add(fromNumber(value));\n } else {\n result = result.mul(radixToPower);\n result = result.add(fromNumber(value));\n }\n }\n result.unsigned = unsigned;\n return result;\n }\n\n /**\n * Returns a Long representation of the given string, written using the specified radix.\n * @function\n * @param {string} str The textual representation of the Long\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\n * @returns {!Long} The corresponding Long value\n */\n Long.fromString = fromString;\n\n /**\n * @function\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\n * @param {boolean=} unsigned\n * @returns {!Long}\n * @inner\n */\n function fromValue(val, unsigned) {\n if (typeof val === \"number\") return fromNumber(val, unsigned);\n if (typeof val === \"string\") return fromString(val, unsigned);\n // Throws for non-objects, converts non-instanceof Long:\n return fromBits(\n val.low,\n val.high,\n typeof unsigned === \"boolean\" ? unsigned : val.unsigned,\n );\n }\n\n /**\n * Converts the specified value to a Long using the appropriate from* function for its type.\n * @function\n * @param {!Long|number|bigint|string|!{low: number, high: number, unsigned: boolean}} val Value\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long}\n */\n Long.fromValue = fromValue;\n\n // NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\n // no runtime penalty for these.\n\n /**\n * @type {number}\n * @const\n * @inner\n */\n var TWO_PWR_16_DBL = 1 << 16;\n\n /**\n * @type {number}\n * @const\n * @inner\n */\n var TWO_PWR_24_DBL = 1 << 24;\n\n /**\n * @type {number}\n * @const\n * @inner\n */\n var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\n\n /**\n * @type {number}\n * @const\n * @inner\n */\n var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\n\n /**\n * @type {number}\n * @const\n * @inner\n */\n var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\n\n /**\n * @type {!Long}\n * @const\n * @inner\n */\n var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\n\n /**\n * @type {!Long}\n * @inner\n */\n var ZERO = fromInt(0);\n\n /**\n * Signed zero.\n * @type {!Long}\n */\n Long.ZERO = ZERO;\n\n /**\n * @type {!Long}\n * @inner\n */\n var UZERO = fromInt(0, true);\n\n /**\n * Unsigned zero.\n * @type {!Long}\n */\n Long.UZERO = UZERO;\n\n /**\n * @type {!Long}\n * @inner\n */\n var ONE = fromInt(1);\n\n /**\n * Signed one.\n * @type {!Long}\n */\n Long.ONE = ONE;\n\n /**\n * @type {!Long}\n * @inner\n */\n var UONE = fromInt(1, true);\n\n /**\n * Unsigned one.\n * @type {!Long}\n */\n Long.UONE = UONE;\n\n /**\n * @type {!Long}\n * @inner\n */\n var NEG_ONE = fromInt(-1);\n\n /**\n * Signed negative one.\n * @type {!Long}\n */\n Long.NEG_ONE = NEG_ONE;\n\n /**\n * @type {!Long}\n * @inner\n */\n var MAX_VALUE = fromBits(0xffffffff | 0, 0x7fffffff | 0, false);\n\n /**\n * Maximum signed value.\n * @type {!Long}\n */\n Long.MAX_VALUE = MAX_VALUE;\n\n /**\n * @type {!Long}\n * @inner\n */\n var MAX_UNSIGNED_VALUE = fromBits(0xffffffff | 0, 0xffffffff | 0, true);\n\n /**\n * Maximum unsigned value.\n * @type {!Long}\n */\n Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\n\n /**\n * @type {!Long}\n * @inner\n */\n var MIN_VALUE = fromBits(0, 0x80000000 | 0, false);\n\n /**\n * Minimum signed value.\n * @type {!Long}\n */\n Long.MIN_VALUE = MIN_VALUE;\n\n /**\n * @alias Long.prototype\n * @inner\n */\n var LongPrototype = Long.prototype;\n\n /**\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\n * @this {!Long}\n * @returns {number}\n */\n LongPrototype.toInt = function toInt() {\n return this.unsigned ? this.low >>> 0 : this.low;\n };\n\n /**\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\n * @this {!Long}\n * @returns {number}\n */\n LongPrototype.toNumber = function toNumber() {\n if (this.unsigned)\n return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0);\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\n };\n\n /**\n * Converts the Long to a string written in the specified radix.\n * @this {!Long}\n * @param {number=} radix Radix (2-36), defaults to 10\n * @returns {string}\n * @override\n * @throws {RangeError} If `radix` is out of range\n */\n LongPrototype.toString = function toString(radix) {\n radix = radix || 10;\n if (radix < 2 || 36 < radix) throw RangeError(\"radix\");\n if (this.isZero()) return \"0\";\n if (this.isNegative()) {\n // Unsigned Longs are never negative\n if (this.eq(MIN_VALUE)) {\n // We need to change the Long value before it can be negated, so we remove\n // the bottom-most digit in this base and then recurse to do the rest.\n var radixLong = fromNumber(radix),\n div = this.div(radixLong),\n rem1 = div.mul(radixLong).sub(this);\n return div.toString(radix) + rem1.toInt().toString(radix);\n } else return \"-\" + this.neg().toString(radix);\n }\n\n // Do several (6) digits each time through the loop, so as to\n // minimize the calls to the very expensive emulated div.\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\n rem = this;\n var result = \"\";\n while (true) {\n var remDiv = rem.div(radixToPower),\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\n digits = intval.toString(radix);\n rem = remDiv;\n if (rem.isZero()) return digits + result;\n else {\n while (digits.length < 6) digits = \"0\" + digits;\n result = \"\" + digits + result;\n }\n }\n };\n\n /**\n * Gets the high 32 bits as a signed integer.\n * @this {!Long}\n * @returns {number} Signed high bits\n */\n LongPrototype.getHighBits = function getHighBits() {\n return this.high;\n };\n\n /**\n * Gets the high 32 bits as an unsigned integer.\n * @this {!Long}\n * @returns {number} Unsigned high bits\n */\n LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\n return this.high >>> 0;\n };\n\n /**\n * Gets the low 32 bits as a signed integer.\n * @this {!Long}\n * @returns {number} Signed low bits\n */\n LongPrototype.getLowBits = function getLowBits() {\n return this.low;\n };\n\n /**\n * Gets the low 32 bits as an unsigned integer.\n * @this {!Long}\n * @returns {number} Unsigned low bits\n */\n LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\n return this.low >>> 0;\n };\n\n /**\n * Gets the number of bits needed to represent the absolute value of this Long.\n * @this {!Long}\n * @returns {number}\n */\n LongPrototype.getNumBitsAbs = function getNumBitsAbs() {\n if (this.isNegative())\n // Unsigned Longs are never negative\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\n var val = this.high != 0 ? this.high : this.low;\n for (var bit = 31; bit > 0; bit--) if ((val & (1 << bit)) != 0) break;\n return this.high != 0 ? bit + 33 : bit + 1;\n };\n\n /**\n * Tests if this Long can be safely represented as a JavaScript number.\n * @this {!Long}\n * @returns {boolean}\n */\n LongPrototype.isSafeInteger = function isSafeInteger() {\n // 2^53-1 is the maximum safe value\n var top11Bits = this.high >> 21;\n // [0, 2^53-1]\n if (!top11Bits) return true;\n // > 2^53-1\n if (this.unsigned) return false;\n // [-2^53, -1] except -2^53\n return top11Bits === -1 && !(this.low === 0 && this.high === -0x200000);\n };\n\n /**\n * Tests if this Long's value equals zero.\n * @this {!Long}\n * @returns {boolean}\n */\n LongPrototype.isZero = function isZero() {\n return this.high === 0 && this.low === 0;\n };\n\n /**\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\n * @returns {boolean}\n */\n LongPrototype.eqz = LongPrototype.isZero;\n\n /**\n * Tests if this Long's value is negative.\n * @this {!Long}\n * @returns {boolean}\n */\n LongPrototype.isNegative = function isNegative() {\n return !this.unsigned && this.high < 0;\n };\n\n /**\n * Tests if this Long's value is positive or zero.\n * @this {!Long}\n * @returns {boolean}\n */\n LongPrototype.isPositive = function isPositive() {\n return this.unsigned || this.high >= 0;\n };\n\n /**\n * Tests if this Long's value is odd.\n * @this {!Long}\n * @returns {boolean}\n */\n LongPrototype.isOdd = function isOdd() {\n return (this.low & 1) === 1;\n };\n\n /**\n * Tests if this Long's value is even.\n * @this {!Long}\n * @returns {boolean}\n */\n LongPrototype.isEven = function isEven() {\n return (this.low & 1) === 0;\n };\n\n /**\n * Tests if this Long's value equals the specified's.\n * @this {!Long}\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.equals = function equals(other) {\n if (!isLong(other)) other = fromValue(other);\n if (\n this.unsigned !== other.unsigned &&\n this.high >>> 31 === 1 &&\n other.high >>> 31 === 1\n )\n return false;\n return this.high === other.high && this.low === other.low;\n };\n\n /**\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\n * @function\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.eq = LongPrototype.equals;\n\n /**\n * Tests if this Long's value differs from the specified's.\n * @this {!Long}\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.notEquals = function notEquals(other) {\n return !this.eq(/* validates */ other);\n };\n\n /**\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\n * @function\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.neq = LongPrototype.notEquals;\n\n /**\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\n * @function\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.ne = LongPrototype.notEquals;\n\n /**\n * Tests if this Long's value is less than the specified's.\n * @this {!Long}\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.lessThan = function lessThan(other) {\n return this.comp(/* validates */ other) < 0;\n };\n\n /**\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\n * @function\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.lt = LongPrototype.lessThan;\n\n /**\n * Tests if this Long's value is less than or equal the specified's.\n * @this {!Long}\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\n return this.comp(/* validates */ other) <= 0;\n };\n\n /**\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\n * @function\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.lte = LongPrototype.lessThanOrEqual;\n\n /**\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\n * @function\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.le = LongPrototype.lessThanOrEqual;\n\n /**\n * Tests if this Long's value is greater than the specified's.\n * @this {!Long}\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.greaterThan = function greaterThan(other) {\n return this.comp(/* validates */ other) > 0;\n };\n\n /**\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\n * @function\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.gt = LongPrototype.greaterThan;\n\n /**\n * Tests if this Long's value is greater than or equal the specified's.\n * @this {!Long}\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\n return this.comp(/* validates */ other) >= 0;\n };\n\n /**\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\n * @function\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.gte = LongPrototype.greaterThanOrEqual;\n\n /**\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\n * @function\n * @param {!Long|number|bigint|string} other Other value\n * @returns {boolean}\n */\n LongPrototype.ge = LongPrototype.greaterThanOrEqual;\n\n /**\n * Compares this Long's value with the specified's.\n * @this {!Long}\n * @param {!Long|number|bigint|string} other Other value\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\n * if the given one is greater\n */\n LongPrototype.compare = function compare(other) {\n if (!isLong(other)) other = fromValue(other);\n if (this.eq(other)) return 0;\n var thisNeg = this.isNegative(),\n otherNeg = other.isNegative();\n if (thisNeg && !otherNeg) return -1;\n if (!thisNeg && otherNeg) return 1;\n // At this point the sign bits are the same\n if (!this.unsigned) return this.sub(other).isNegative() ? -1 : 1;\n // Both are positive if at least one is unsigned\n return other.high >>> 0 > this.high >>> 0 ||\n (other.high === this.high && other.low >>> 0 > this.low >>> 0)\n ? -1\n : 1;\n };\n\n /**\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\n * @function\n * @param {!Long|number|bigint|string} other Other value\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\n * if the given one is greater\n */\n LongPrototype.comp = LongPrototype.compare;\n\n /**\n * Negates this Long's value.\n * @this {!Long}\n * @returns {!Long} Negated Long\n */\n LongPrototype.negate = function negate() {\n if (!this.unsigned && this.eq(MIN_VALUE)) return MIN_VALUE;\n return this.not().add(ONE);\n };\n\n /**\n * Negates this Long's value. This is an alias of {@link Long#negate}.\n * @function\n * @returns {!Long} Negated Long\n */\n LongPrototype.neg = LongPrototype.negate;\n\n /**\n * Returns the sum of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|bigint|string} addend Addend\n * @returns {!Long} Sum\n */\n LongPrototype.add = function add(addend) {\n if (!isLong(addend)) addend = fromValue(addend);\n\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\n\n var a48 = this.high >>> 16;\n var a32 = this.high & 0xffff;\n var a16 = this.low >>> 16;\n var a00 = this.low & 0xffff;\n var b48 = addend.high >>> 16;\n var b32 = addend.high & 0xffff;\n var b16 = addend.low >>> 16;\n var b00 = addend.low & 0xffff;\n var c48 = 0,\n c32 = 0,\n c16 = 0,\n c00 = 0;\n c00 += a00 + b00;\n c16 += c00 >>> 16;\n c00 &= 0xffff;\n c16 += a16 + b16;\n c32 += c16 >>> 16;\n c16 &= 0xffff;\n c32 += a32 + b32;\n c48 += c32 >>> 16;\n c32 &= 0xffff;\n c48 += a48 + b48;\n c48 &= 0xffff;\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\n };\n\n /**\n * Returns the difference of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|bigint|string} subtrahend Subtrahend\n * @returns {!Long} Difference\n */\n LongPrototype.subtract = function subtract(subtrahend) {\n if (!isLong(subtrahend)) subtrahend = fromValue(subtrahend);\n return this.add(subtrahend.neg());\n };\n\n /**\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\n * @function\n * @param {!Long|number|bigint|string} subtrahend Subtrahend\n * @returns {!Long} Difference\n */\n LongPrototype.sub = LongPrototype.subtract;\n\n /**\n * Returns the product of this and the specified Long.\n * @this {!Long}\n * @param {!Long|number|bigint|string} multiplier Multiplier\n * @returns {!Long} Product\n */\n LongPrototype.multiply = function multiply(multiplier) {\n if (this.isZero()) return this;\n if (!isLong(multiplier)) multiplier = fromValue(multiplier);\n\n // use wasm support if present\n if (wasm) {\n var low = wasm[\"mul\"](\n this.low,\n this.high,\n multiplier.low,\n multiplier.high,\n );\n return fromBits(low, wasm[\"get_high\"](), this.unsigned);\n }\n if (multiplier.isZero()) return this.unsigned ? UZERO : ZERO;\n if (this.eq(MIN_VALUE)) return multiplier.isOdd() ? MIN_VALUE : ZERO;\n if (multiplier.eq(MIN_VALUE)) return this.isOdd() ? MIN_VALUE : ZERO;\n if (this.isNegative()) {\n if (multiplier.isNegative()) return this.neg().mul(multiplier.neg());\n else return this.neg().mul(multiplier).neg();\n } else if (multiplier.isNegative())\n return this.mul(multiplier.neg()).neg();\n\n // If both longs are small, use float multiplication\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\n return fromNumber(\n this.toNumber() * multiplier.toNumber(),\n this.unsigned,\n );\n\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\n // We can skip products that would overflow.\n\n var a48 = this.high >>> 16;\n var a32 = this.high & 0xffff;\n var a16 = this.low >>> 16;\n var a00 = this.low & 0xffff;\n var b48 = multiplier.high >>> 16;\n var b32 = multiplier.high & 0xffff;\n var b16 = multiplier.low >>> 16;\n var b00 = multiplier.low & 0xffff;\n var c48 = 0,\n c32 = 0,\n c16 = 0,\n c00 = 0;\n c00 += a00 * b00;\n c16 += c00 >>> 16;\n c00 &= 0xffff;\n c16 += a16 * b00;\n c32 += c16 >>> 16;\n c16 &= 0xffff;\n c16 += a00 * b16;\n c32 += c16 >>> 16;\n c16 &= 0xffff;\n c32 += a32 * b00;\n c48 += c32 >>> 16;\n c32 &= 0xffff;\n c32 += a16 * b16;\n c48 += c32 >>> 16;\n c32 &= 0xffff;\n c32 += a00 * b32;\n c48 += c32 >>> 16;\n c32 &= 0xffff;\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\n c48 &= 0xffff;\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\n };\n\n /**\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\n * @function\n * @param {!Long|number|bigint|string} multiplier Multiplier\n * @returns {!Long} Product\n */\n LongPrototype.mul = LongPrototype.multiply;\n\n /**\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\n * unsigned if this Long is unsigned.\n * @this {!Long}\n * @param {!Long|number|bigint|string} divisor Divisor\n * @returns {!Long} Quotient\n */\n LongPrototype.divide = function divide(divisor) {\n if (!isLong(divisor)) divisor = fromValue(divisor);\n if (divisor.isZero()) throw Error(\"division by zero\");\n\n // use wasm support if present\n if (wasm) {\n // guard against signed division overflow: the largest\n // negative number / -1 would be 1 larger than the largest\n // positive number, due to two's complement.\n if (\n !this.unsigned &&\n this.high === -0x80000000 &&\n divisor.low === -1 &&\n divisor.high === -1\n ) {\n // be consistent with non-wasm code path\n return this;\n }\n var low = (this.unsigned ? wasm[\"div_u\"] : wasm[\"div_s\"])(\n this.low,\n this.high,\n divisor.low,\n divisor.high,\n );\n return fromBits(low, wasm[\"get_high\"](), this.unsigned);\n }\n if (this.isZero()) return this.unsigned ? UZERO : ZERO;\n var approx, rem, res;\n if (!this.unsigned) {\n // This section is only relevant for signed longs and is derived from the\n // closure library as a whole.\n if (this.eq(MIN_VALUE)) {\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\n else if (divisor.eq(MIN_VALUE)) return ONE;\n else {\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\n var halfThis = this.shr(1);\n approx = halfThis.div(divisor).shl(1);\n if (approx.eq(ZERO)) {\n return divisor.isNegative() ? ONE : NEG_ONE;\n } else {\n rem = this.sub(divisor.mul(approx));\n res = approx.add(rem.div(divisor));\n return res;\n }\n }\n } else if (divisor.eq(MIN_VALUE)) return this.unsigned ? UZERO : ZERO;\n if (this.isNegative()) {\n if (divisor.isNegative()) return this.neg().div(divisor.neg());\n return this.neg().div(divisor).neg();\n } else if (divisor.isNegative()) return this.div(divisor.neg()).neg();\n res = ZERO;\n } else {\n // The algorithm below has not been made for unsigned longs. It's therefore\n // required to take special care of the MSB prior to running it.\n if (!divisor.unsigned) divisor = divisor.toUnsigned();\n if (divisor.gt(this)) return UZERO;\n if (divisor.gt(this.shru(1)))\n // 15 >>> 1 = 7 ; with divisor = 8 ; true\n return UONE;\n res = UZERO;\n }\n\n // Repeat the following until the remainder is less than other: find a\n // floating-point that approximates remainder / other *from below*, add this\n // into the result, and subtract it from the remainder. It is critical that\n // the approximate value is less than or equal to the real value so that the\n // remainder never becomes negative.\n rem = this;\n while (rem.gte(divisor)) {\n // Approximate the result of division. This may be a little greater or\n // smaller than the actual value.\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\n\n // We will tweak the approximate result by changing it in the 48-th digit or\n // the smallest non-fractional digit, whichever is larger.\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\n delta = log2 <= 48 ? 1 : pow_dbl(2, log2 - 48),\n // Decrease the approximation until it is smaller than the remainder. Note\n // that if it is too large, the product overflows and is negative.\n approxRes = fromNumber(approx),\n approxRem = approxRes.mul(divisor);\n while (approxRem.isNegative() || approxRem.gt(rem)) {\n approx -= delta;\n approxRes = fromNumber(approx, this.unsigned);\n approxRem = approxRes.mul(divisor);\n }\n\n // We know the answer can't be zero... and actually, zero would cause\n // infinite recursion since we would make no progress.\n if (approxRes.isZero()) approxRes = ONE;\n res = res.add(approxRes);\n rem = rem.sub(approxRem);\n }\n return res;\n };\n\n /**\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\n * @function\n * @param {!Long|number|bigint|string} divisor Divisor\n * @returns {!Long} Quotient\n */\n LongPrototype.div = LongPrototype.divide;\n\n /**\n * Returns this Long modulo the specified.\n * @this {!Long}\n * @param {!Long|number|bigint|string} divisor Divisor\n * @returns {!Long} Remainder\n */\n LongPrototype.modulo = function modulo(divisor) {\n if (!isLong(divisor)) divisor = fromValue(divisor);\n\n // use wasm support if present\n if (wasm) {\n var low = (this.unsigned ? wasm[\"rem_u\"] : wasm[\"rem_s\"])(\n this.low,\n this.high,\n divisor.low,\n divisor.high,\n );\n return fromBits(low, wasm[\"get_high\"](), this.unsigned);\n }\n return this.sub(this.div(divisor).mul(divisor));\n };\n\n /**\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\n * @function\n * @param {!Long|number|bigint|string} divisor Divisor\n * @returns {!Long} Remainder\n */\n LongPrototype.mod = LongPrototype.modulo;\n\n /**\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\n * @function\n * @param {!Long|number|bigint|string} divisor Divisor\n * @returns {!Long} Remainder\n */\n LongPrototype.rem = LongPrototype.modulo;\n\n /**\n * Returns the bitwise NOT of this Long.\n * @this {!Long}\n * @returns {!Long}\n */\n LongPrototype.not = function not() {\n return fromBits(~this.low, ~this.high, this.unsigned);\n };\n\n /**\n * Returns count leading zeros of this Long.\n * @this {!Long}\n * @returns {!number}\n */\n LongPrototype.countLeadingZeros = function countLeadingZeros() {\n return this.high ? Math.clz32(this.high) : Math.clz32(this.low) + 32;\n };\n\n /**\n * Returns count leading zeros. This is an alias of {@link Long#countLeadingZeros}.\n * @function\n * @param {!Long}\n * @returns {!number}\n */\n LongPrototype.clz = LongPrototype.countLeadingZeros;\n\n /**\n * Returns count trailing zeros of this Long.\n * @this {!Long}\n * @returns {!number}\n */\n LongPrototype.countTrailingZeros = function countTrailingZeros() {\n return this.low ? ctz32(this.low) : ctz32(this.high) + 32;\n };\n\n /**\n * Returns count trailing zeros. This is an alias of {@link Long#countTrailingZeros}.\n * @function\n * @param {!Long}\n * @returns {!number}\n */\n LongPrototype.ctz = LongPrototype.countTrailingZeros;\n\n /**\n * Returns the bitwise AND of this Long and the specified.\n * @this {!Long}\n * @param {!Long|number|bigint|string} other Other Long\n * @returns {!Long}\n */\n LongPrototype.and = function and(other) {\n if (!isLong(other)) other = fromValue(other);\n return fromBits(\n this.low & other.low,\n this.high & other.high,\n this.unsigned,\n );\n };\n\n /**\n * Returns the bitwise OR of this Long and the specified.\n * @this {!Long}\n * @param {!Long|number|bigint|string} other Other Long\n * @returns {!Long}\n */\n LongPrototype.or = function or(other) {\n if (!isLong(other)) other = fromValue(other);\n return fromBits(\n this.low | other.low,\n this.high | other.high,\n this.unsigned,\n );\n };\n\n /**\n * Returns the bitwise XOR of this Long and the given one.\n * @this {!Long}\n * @param {!Long|number|bigint|string} other Other Long\n * @returns {!Long}\n */\n LongPrototype.xor = function xor(other) {\n if (!isLong(other)) other = fromValue(other);\n return fromBits(\n this.low ^ other.low,\n this.high ^ other.high,\n this.unsigned,\n );\n };\n\n /**\n * Returns this Long with bits shifted to the left by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\n LongPrototype.shiftLeft = function shiftLeft(numBits) {\n if (isLong(numBits)) numBits = numBits.toInt();\n if ((numBits &= 63) === 0) return this;\n else if (numBits < 32)\n return fromBits(\n this.low << numBits,\n (this.high << numBits) | (this.low >>> (32 - numBits)),\n this.unsigned,\n );\n else return fromBits(0, this.low << (numBits - 32), this.unsigned);\n };\n\n /**\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\n LongPrototype.shl = LongPrototype.shiftLeft;\n\n /**\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\n LongPrototype.shiftRight = function shiftRight(numBits) {\n if (isLong(numBits)) numBits = numBits.toInt();\n if ((numBits &= 63) === 0) return this;\n else if (numBits < 32)\n return fromBits(\n (this.low >>> numBits) | (this.high << (32 - numBits)),\n this.high >> numBits,\n this.unsigned,\n );\n else\n return fromBits(\n this.high >> (numBits - 32),\n this.high >= 0 ? 0 : -1,\n this.unsigned,\n );\n };\n\n /**\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\n LongPrototype.shr = LongPrototype.shiftRight;\n\n /**\n * Returns this Long with bits logically shifted to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\n LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\n if (isLong(numBits)) numBits = numBits.toInt();\n if ((numBits &= 63) === 0) return this;\n if (numBits < 32)\n return fromBits(\n (this.low >>> numBits) | (this.high << (32 - numBits)),\n this.high >>> numBits,\n this.unsigned,\n );\n if (numBits === 32) return fromBits(this.high, 0, this.unsigned);\n return fromBits(this.high >>> (numBits - 32), 0, this.unsigned);\n };\n\n /**\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\n LongPrototype.shru = LongPrototype.shiftRightUnsigned;\n\n /**\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Shifted Long\n */\n LongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\n\n /**\n * Returns this Long with bits rotated to the left by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\n LongPrototype.rotateLeft = function rotateLeft(numBits) {\n var b;\n if (isLong(numBits)) numBits = numBits.toInt();\n if ((numBits &= 63) === 0) return this;\n if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);\n if (numBits < 32) {\n b = 32 - numBits;\n return fromBits(\n (this.low << numBits) | (this.high >>> b),\n (this.high << numBits) | (this.low >>> b),\n this.unsigned,\n );\n }\n numBits -= 32;\n b = 32 - numBits;\n return fromBits(\n (this.high << numBits) | (this.low >>> b),\n (this.low << numBits) | (this.high >>> b),\n this.unsigned,\n );\n };\n /**\n * Returns this Long with bits rotated to the left by the given amount. This is an alias of {@link Long#rotateLeft}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\n LongPrototype.rotl = LongPrototype.rotateLeft;\n\n /**\n * Returns this Long with bits rotated to the right by the given amount.\n * @this {!Long}\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\n LongPrototype.rotateRight = function rotateRight(numBits) {\n var b;\n if (isLong(numBits)) numBits = numBits.toInt();\n if ((numBits &= 63) === 0) return this;\n if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);\n if (numBits < 32) {\n b = 32 - numBits;\n return fromBits(\n (this.high << b) | (this.low >>> numBits),\n (this.low << b) | (this.high >>> numBits),\n this.unsigned,\n );\n }\n numBits -= 32;\n b = 32 - numBits;\n return fromBits(\n (this.low << b) | (this.high >>> numBits),\n (this.high << b) | (this.low >>> numBits),\n this.unsigned,\n );\n };\n /**\n * Returns this Long with bits rotated to the right by the given amount. This is an alias of {@link Long#rotateRight}.\n * @function\n * @param {number|!Long} numBits Number of bits\n * @returns {!Long} Rotated Long\n */\n LongPrototype.rotr = LongPrototype.rotateRight;\n\n /**\n * Converts this Long to signed.\n * @this {!Long}\n * @returns {!Long} Signed long\n */\n LongPrototype.toSigned = function toSigned() {\n if (!this.unsigned) return this;\n return fromBits(this.low, this.high, false);\n };\n\n /**\n * Converts this Long to unsigned.\n * @this {!Long}\n * @returns {!Long} Unsigned long\n */\n LongPrototype.toUnsigned = function toUnsigned() {\n if (this.unsigned) return this;\n return fromBits(this.low, this.high, true);\n };\n\n /**\n * Converts this Long to its byte representation.\n * @param {boolean=} le Whether little or big endian, defaults to big endian\n * @this {!Long}\n * @returns {!Array.<number>} Byte representation\n */\n LongPrototype.toBytes = function toBytes(le) {\n return le ? this.toBytesLE() : this.toBytesBE();\n };\n\n /**\n * Converts this Long to its little endian byte representation.\n * @this {!Long}\n * @returns {!Array.<number>} Little endian byte representation\n */\n LongPrototype.toBytesLE = function toBytesLE() {\n var hi = this.high,\n lo = this.low;\n return [\n lo & 0xff,\n (lo >>> 8) & 0xff,\n (lo >>> 16) & 0xff,\n lo >>> 24,\n hi & 0xff,\n (hi >>> 8) & 0xff,\n (hi >>> 16) & 0xff,\n hi >>> 24,\n ];\n };\n\n /**\n * Converts this Long to its big endian byte representation.\n * @this {!Long}\n * @returns {!Array.<number>} Big endian byte representation\n */\n LongPrototype.toBytesBE = function toBytesBE() {\n var hi = this.high,\n lo = this.low;\n return [\n hi >>> 24,\n (hi >>> 16) & 0xff,\n (hi >>> 8) & 0xff,\n hi & 0xff,\n lo >>> 24,\n (lo >>> 16) & 0xff,\n (lo >>> 8) & 0xff,\n lo & 0xff,\n ];\n };\n\n /**\n * Creates a Long from its byte representation.\n * @param {!Array.<number>} bytes Byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @param {boolean=} le Whether little or big endian, defaults to big endian\n * @returns {Long} The corresponding Long value\n */\n Long.fromBytes = function fromBytes(bytes, unsigned, le) {\n return le\n ? Long.fromBytesLE(bytes, unsigned)\n : Long.fromBytesBE(bytes, unsigned);\n };\n\n /**\n * Creates a Long from its little endian byte representation.\n * @param {!Array.<number>} bytes Little endian byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {Long} The corresponding Long value\n */\n Long.fromBytesLE = function fromBytesLE(bytes, unsigned) {\n return new Long(\n bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24),\n bytes[4] | (bytes[5] << 8) | (bytes[6] << 16) | (bytes[7] << 24),\n unsigned,\n );\n };\n\n /**\n * Creates a Long from its big endian byte representation.\n * @param {!Array.<number>} bytes Big endian byte representation\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {Long} The corresponding Long value\n */\n Long.fromBytesBE = function fromBytesBE(bytes, unsigned) {\n return new Long(\n (bytes[4] << 24) | (bytes[5] << 16) | (bytes[6] << 8) | bytes[7],\n (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3],\n unsigned,\n );\n };\n\n // Support conversion to/from BigInt where available\n if (typeof BigInt === \"function\") {\n /**\n * Returns a Long representing the given big integer.\n * @function\n * @param {number} value The big integer value\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\n * @returns {!Long} The corresponding Long value\n */\n Long.fromBigInt = function fromBigInt(value, unsigned) {\n var lowBits = Number(BigInt.asIntN(32, value));\n var highBits = Number(BigInt.asIntN(32, value >> BigInt(32)));\n return fromBits(lowBits, highBits, unsigned);\n };\n\n // Override\n Long.fromValue = function fromValueWithBigInt(value, unsigned) {\n if (typeof value === \"bigint\") return Long.fromBigInt(value, unsigned);\n return fromValue(value, unsigned);\n };\n\n /**\n * Converts the Long to its big integer representation.\n * @this {!Long}\n * @returns {bigint}\n */\n LongPrototype.toBigInt = function toBigInt() {\n var lowBigInt = BigInt(this.low >>> 0);\n var highBigInt = BigInt(this.unsigned ? this.high >>> 0 : this.high);\n return (highBigInt << BigInt(32)) | lowBigInt;\n };\n }\n var _default = (_exports.default = Long);\n },\n);\n","\"use strict\";\n/* global globalThis */\nvar util = exports;\n\n// used to return a Promise where callback is omitted\nutil.asPromise = require(\"./aspromise\");\n\n// converts to / from base64 encoded strings\nutil.base64 = require(\"./base64\");\n\n// base class of rpc.Service\nutil.EventEmitter = require(\"./eventemitter\");\n\n// float handling accross browsers\nutil.float = require(\"./float\");\n\n// converts to / from utf8 encoded strings\nutil.utf8 = require(\"./utf8\");\n\n// provides a node-like buffer pool in the browser\nutil.pool = require(\"./pool\");\n\n// utility to work with the low and high bits of a 64 bit value\nutil.LongBits = require(\"./longbits\");\n\n/**\n * Tests if the specified key can affect object prototypes.\n * @memberof util\n * @param {string} key Key to test\n * @returns {boolean} `true` if the key is unsafe\n */\nfunction isUnsafeProperty(key) {\n return key === \"__proto__\" || key === \"prototype\" || key === \"constructor\";\n}\n\nutil.isUnsafeProperty = isUnsafeProperty;\n\n/**\n * Whether running within node or not.\n * @memberof util\n * @type {boolean}\n */\nutil.isNode = Boolean(typeof global !== \"undefined\"\n && global\n && global.process\n && global.process.versions\n && global.process.versions.node);\n\n/**\n * Global object reference.\n * @memberof util\n * @type {Object}\n */\nutil.global = util.isNode && global\n || typeof window !== \"undefined\" && window\n || typeof self !== \"undefined\" && self\n || typeof globalThis !== \"undefined\" && globalThis\n || this; // eslint-disable-line no-invalid-this\n\n/**\n * An immuable empty array.\n * @memberof util\n * @type {Array.<*>}\n * @const\n */\nutil.emptyArray = Object.freeze ? Object.freeze([]) : /* istanbul ignore next */ []; // used on prototypes\n\n/**\n * An immutable empty object.\n * @type {Object}\n * @const\n */\nutil.emptyObject = Object.freeze ? Object.freeze({}) : /* istanbul ignore next */ {}; // used on prototypes\n\n/**\n * Tests if the specified value is an integer.\n * @function\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is an integer\n */\nutil.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) {\n return typeof value === \"number\" && isFinite(value) && Math.floor(value) === value;\n};\n\n/**\n * Tests if the specified value is a string.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a string\n */\nutil.isString = function isString(value) {\n return typeof value === \"string\" || value instanceof String;\n};\n\n/**\n * Tests if the specified value is a non-null object.\n * @param {*} value Value to test\n * @returns {boolean} `true` if the value is a non-null object\n */\nutil.isObject = function isObject(value) {\n return value && typeof value === \"object\";\n};\n\n/**\n * Checks if a property on a message is considered to be present.\n * This is an alias of {@link util.isSet}.\n * @function\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isset =\n\n/**\n * Checks if a property on a message is considered to be present.\n * @param {Object} obj Plain object or message instance\n * @param {string} prop Property name\n * @returns {boolean} `true` if considered to be present, otherwise `false`\n */\nutil.isSet = function isSet(obj, prop) {\n var value = obj[prop];\n if (value != null && Object.hasOwnProperty.call(obj, prop)) // eslint-disable-line eqeqeq\n return typeof value !== \"object\" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0;\n return false;\n};\n\n/**\n * Any compatible Buffer instance.\n * This is a minimal stand-alone definition of a Buffer instance. The actual type is that exported by node's typings.\n * @interface Buffer\n * @extends Uint8Array\n */\n\n/**\n * Node's Buffer class if available.\n * @type {Constructor<Buffer>}\n */\nutil.Buffer = (function() {\n try {\n var Buffer = util.global.Buffer;\n // refuse to use non-node buffers if not explicitly assigned (perf reasons)\n return Buffer.prototype.utf8Write || util.isNode ? Buffer : /* istanbul ignore next */ null;\n } catch (e) {\n /* istanbul ignore next */\n return null;\n }\n})();\n\n/**\n * Creates a new buffer of whatever type supported by the environment.\n * @param {number|number[]} [sizeOrArray=0] Buffer size or number array\n * @returns {Uint8Array|Buffer} Buffer\n */\nutil.newBuffer = function newBuffer(sizeOrArray) {\n var Buffer = util.Buffer;\n /* istanbul ignore next */\n return typeof sizeOrArray === \"number\"\n ? Buffer\n ? Buffer.allocUnsafe(sizeOrArray)\n : new Uint8Array(sizeOrArray)\n : Buffer\n ? Buffer.from(sizeOrArray)\n : new Uint8Array(sizeOrArray);\n};\n\n/**\n * Prepends a raw field tag to raw field data.\n * @param {number} id Field id\n * @param {number} wireType Wire type\n * @param {Uint8Array} data Raw field data\n * @returns {Uint8Array|Buffer} Raw field bytes\n * @ignore\n */\nutil.rawField = function rawField(id, wireType, data) {\n var out = [],\n tag = id << 3 | wireType;\n tag >>>= 0;\n while (tag > 127) {\n out.push(tag & 127 | 128);\n tag >>>= 7;\n }\n out.push(tag);\n for (var i = 0; i < data.length; ++i)\n out.push(data[i]);\n return util.newBuffer(out);\n};\n\n/**\n * Array implementation used in the browser.\n * @type {Constructor<Uint8Array>}\n * @deprecated Use `Uint8Array` instead.\n */\nutil.Array = Uint8Array;\n\n/**\n * Any compatible Long instance.\n * This is a minimal stand-alone definition of a Long instance. The actual type is that exported by long.js.\n * @interface Long\n * @property {number} low Low bits\n * @property {number} high High bits\n * @property {boolean} unsigned Whether unsigned or not\n */\n\n/**\n * Long.js's Long class if available.\n * @type {Constructor<Long>}\n */\nutil.Long = /* istanbul ignore next */ util.global.dcodeIO && /* istanbul ignore next */ util.global.dcodeIO.Long\n || /* istanbul ignore next */ util.global.Long\n || (function() {\n try {\n var Long = require(\"long\");\n return Long && Long.isLong ? Long : null;\n } catch (e) {\n /* istanbul ignore next */\n return null;\n }\n })();\n\n/**\n * Regular expression used to verify 2 bit (`bool`) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key2Re = /^(?:true|false|0|1)$/;\n\n/**\n * Regular expression used to verify 32 bit (`int32` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key32Re = /^-?(?:0|[1-9][0-9]*)$/;\n\n/**\n * Regular expression used to verify 64 bit (`int64` etc.) map keys.\n * @type {RegExp}\n * @const\n */\nutil.key64Re = /^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/; // eslint-disable-line no-control-regex\n\n/**\n * Converts a number or long to an 8 characters long hash string.\n * @param {Long|number} value Value to convert\n * @returns {string} Hash\n */\nutil.longToHash = function longToHash(value) {\n return value\n ? util.LongBits.from(value).toHash()\n : util.LongBits.zeroHash;\n};\n\n/**\n * Converts an 8 characters long hash string to a long or number.\n * @param {string} hash Hash\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long|number} Original value\n */\nutil.longFromHash = function longFromHash(hash, unsigned) {\n var bits = util.LongBits.fromHash(hash);\n if (util.Long)\n return util.Long.fromBits(bits.lo, bits.hi, unsigned);\n return bits.toNumber(Boolean(unsigned));\n};\n\n/**\n * Converts a 64 bit key to a long or number if it is an 8 characters long hash string.\n * @param {string} key Map key\n * @param {boolean} [unsigned=false] Whether unsigned or not\n * @returns {Long|number|string} Original value\n */\nutil.longFromKey = function longFromKey(key, unsigned) {\n return util.key64Re.test(key) && !util.key32Re.test(key)\n ? util.longFromHash(key, unsigned)\n : key;\n};\n\n/**\n * Converts a boolean key to a boolean value.\n * @param {string} key Map key\n * @returns {boolean} Boolean value\n */\nutil.boolFromKey = function boolFromKey(key) {\n return key === \"true\" || key === \"1\";\n};\n\n/**\n * Merges the properties of the source object into the destination object.\n * @memberof util\n * @param {Object.<string,*>} dst Destination object\n * @param {...(Object.<string,*>|boolean)} src Source objects, optionally followed by an `ifNotSet` flag\n * @returns {Object.<string,*>} Destination object\n */\nfunction merge(dst) { // used by converters\n var ifNotSet = typeof arguments[arguments.length - 1] === \"boolean\",\n limit = ifNotSet ? arguments.length - 1 : arguments.length;\n ifNotSet = ifNotSet && arguments[arguments.length - 1];\n for (var a = 1; a < limit; ++a) {\n var src = arguments[a];\n if (!src)\n continue;\n for (var keys = Object.keys(src), i = 0; i < keys.length; ++i)\n if (!isUnsafeProperty(keys[i]) && (!ifNotSet || !Object.prototype.hasOwnProperty.call(dst, keys[i]) || dst[keys[i]] === undefined))\n dst[keys[i]] = src[keys[i]];\n }\n return dst;\n}\n\nutil.merge = merge;\n\n/**\n * Schema declaration nesting limit.\n * @memberof util\n * @type {number}\n */\nutil.nestingLimit = 32; // protoc: MaxMessageDeclarationNestingDepth\n\n/**\n * Recursion limit.\n * @memberof util\n * @type {number}\n */\nutil.recursionLimit = 100; // protoc: CodedInputStream::default_recursion_limit_\n\n/**\n * Makes a property safe for assignment as an own property.\n * @memberof util\n * @param {Object.<string,*>} obj Object\n * @param {string} key Property key\n * @param {boolean} [enumerable=true] Whether the property should be enumerable\n * @returns {undefined}\n */\nutil.makeProp = function makeProp(obj, key, enumerable) {\n if (Object.prototype.hasOwnProperty.call(obj, key))\n return;\n Object.defineProperty(obj, key, {\n enumerable: enumerable === undefined ? true : enumerable,\n configurable: true,\n writable: true\n });\n};\n\n/**\n * Converts the first character of a string to lower case.\n * @param {string} str String to convert\n * @returns {string} Converted string\n */\nutil.lcFirst = function lcFirst(str) {\n return str.charAt(0).toLowerCase() + str.substring(1);\n};\n\n/**\n * Creates a custom error constructor.\n * @memberof util\n * @param {string} name Error name\n * @returns {Constructor<Error>} Custom error constructor\n */\nfunction newError(name) {\n\n function CustomError(message, properties) {\n\n if (!(this instanceof CustomError))\n return new CustomError(message, properties);\n\n // Error.call(this, message);\n // ^ just returns a new error instance because the ctor can be called as a function\n\n Object.defineProperty(this, \"message\", { get: function() { return message; } });\n\n /* istanbul ignore next */\n if (Error.captureStackTrace) // node\n Error.captureStackTrace(this, CustomError);\n else\n Object.defineProperty(this, \"stack\", { value: new Error().stack || \"\" });\n\n if (properties)\n merge(this, properties);\n }\n\n CustomError.prototype = Object.create(Error.prototype, {\n constructor: {\n value: CustomError,\n writable: true,\n enumerable: false,\n configurable: true,\n },\n name: {\n get: function get() { return name; },\n set: undefined,\n enumerable: false,\n // configurable: false would accurately preserve the behavior of\n // the original, but I'm guessing that was not intentional.\n // For an actual error subclass, this property would\n // be configurable.\n configurable: true,\n },\n toString: {\n value: function value() { return this.name + \": \" + this.message; },\n writable: true,\n enumerable: false,\n configurable: true,\n },\n });\n\n return CustomError;\n}\n\nutil.newError = newError;\n\n/**\n * Constructs a new protocol error.\n * @classdesc Error subclass indicating a protocol specifc error.\n * @memberof util\n * @extends Error\n * @template T extends Message<T>\n * @constructor\n * @param {string} message Error message\n * @param {Object.<string,*>} [properties] Additional properties\n * @example\n * try {\n * MyMessage.decode(someBuffer); // throws if required fields are missing\n * } catch (e) {\n * if (e instanceof ProtocolError && e.instance)\n * console.log(\"decoded so far: \" + JSON.stringify(e.instance));\n * }\n */\nutil.ProtocolError = newError(\"ProtocolError\");\n\n/**\n * So far decoded message instance.\n * @name util.ProtocolError#instance\n * @type {Message<T>}\n */\n\n/**\n * A OneOf getter as returned by {@link util.oneOfGetter}.\n * @typedef OneOfGetter\n * @type {function}\n * @returns {string|undefined} Set field name, if any\n */\n\n/**\n * Builds a getter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfGetter} Unbound getter\n */\nutil.oneOfGetter = function getOneOf(fieldNames) {\n var fieldMap = {};\n for (var i = 0; i < fieldNames.length; ++i)\n fieldMap[fieldNames[i]] = 1;\n\n /**\n * @returns {string|undefined} Set field name, if any\n * @this Object\n * @ignore\n */\n return function() { // eslint-disable-line consistent-return\n for (var keys = Object.keys(this), i = keys.length - 1; i > -1; --i)\n if (fieldMap[keys[i]] === 1 && this[keys[i]] !== undefined && this[keys[i]] !== null)\n return keys[i];\n };\n};\n\n/**\n * A OneOf setter as returned by {@link util.oneOfSetter}.\n * @typedef OneOfSetter\n * @type {function}\n * @param {string|undefined} value Field name\n * @returns {undefined}\n */\n\n/**\n * Builds a setter for a oneof's present field name.\n * @param {string[]} fieldNames Field names\n * @returns {OneOfSetter} Unbound setter\n */\nutil.oneOfSetter = function setOneOf(fieldNames) {\n\n /**\n * @param {string} name Field name\n * @returns {undefined}\n * @this Object\n * @ignore\n */\n return function(name) {\n for (var i = 0; i < fieldNames.length; ++i)\n if (fieldNames[i] !== name)\n delete this[fieldNames[i]];\n };\n};\n\n/**\n * Default conversion options used for {@link Message#toJSON} implementations.\n *\n * These options are close to proto3's JSON mapping with the exception that internal types like Any are handled just like messages. More precisely:\n *\n * - Longs become strings\n * - Enums become string keys\n * - Bytes become base64 encoded strings\n * - (Sub-)Messages become plain objects\n * - Maps become plain objects with all string keys\n * - Repeated fields become arrays\n * - NaN and Infinity for float and double fields become strings\n *\n * @type {IConversionOptions}\n * @see https://developers.google.com/protocol-buffers/docs/proto3?hl=en#json\n */\nutil.toJSONOptions = {\n longs: String,\n enums: String,\n bytes: String,\n json: true\n};\n","\"use strict\";\nmodule.exports = Writer;\n\nvar util = require(\"./util/minimal\");\n\nvar BufferWriter; // cyclic\n\nvar LongBits = util.LongBits,\n base64 = util.base64,\n utf8 = util.utf8;\n\n/**\n * Constructs a new writer instance.\n * @classdesc Wire format writer using `Uint8Array`.\n * @constructor\n */\nfunction Writer() {\n\n /**\n * Write cursor into {@link Writer#buf}.\n * @type {number}\n */\n this.pos = 0;\n\n /**\n * Backing buffer.\n * @type {Uint8Array}\n */\n this.buf = this.constructor.alloc(64);\n\n /**\n * Cached DataView over {@link Writer#buf}.\n * @type {DataView|null}\n */\n this.view = null;\n\n /**\n * Stack of forked length-prefix positions.\n * @type {Array<number>|null}\n */\n this.states = null;\n}\n\n/**\n * Current write position.\n * @name Writer#len\n * @type {number}\n * @deprecated Use {@link Writer#pos} instead.\n */\nObject.defineProperty(Writer.prototype, \"len\", {\n configurable: true,\n enumerable: true,\n get: function get_len() {\n return this.pos;\n }\n});\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup() {\n return (Writer.create = function create_buffer() {\n return new BufferWriter();\n })();\n }\n /* istanbul ignore next */\n : function create_array() {\n return new Writer();\n };\n};\n\n/**\n * Creates a new writer.\n * @function\n * @returns {BufferWriter|Writer} A {@link BufferWriter} when Buffers are supported, otherwise a {@link Writer}\n */\nWriter.create = create();\n\n/**\n * Allocates a buffer of the specified size.\n * @param {number} size Buffer size\n * @returns {Uint8Array} Buffer\n */\nWriter.alloc = function alloc(size) {\n return new Uint8Array(size);\n};\n\n// Use Uint8Array buffer pool in the browser, just like node does with buffers\nWriter.alloc = util.pool(Writer.alloc, Uint8Array.prototype.subarray);\n\n/**\n * Calculates the number of bytes a value occupies as a varint.\n * @param {number} value Value to size (unsigned)\n * @returns {number} Byte length (1..5)\n * @ignore\n */\nfunction sizeVarint32(value) {\n return value < 128 ? 1\n : value < 16384 ? 2\n : value < 2097152 ? 3\n : value < 268435456 ? 4\n : 5;\n}\n\n/**\n * Ensures that at least `n` more bytes fit into the backing buffer, doubling it if not.\n * @param {number} n Number of additional bytes required\n * @returns {undefined}\n * @private\n */\nWriter.prototype._reserve = function _reserve(n) {\n var need = this.pos + n;\n if (need > this.buf.length) {\n var size = this.buf.length << 1;\n if (size < need)\n size = need;\n var buf = this.constructor.alloc(size);\n buf.set(this.buf.subarray(0, this.pos), 0);\n this.buf = buf;\n this.view = null; // invalidate\n }\n};\n\nfunction writeStringAscii(val, buf, pos) {\n for (var i = 0; i < val.length;)\n buf[pos++] = val.charCodeAt(i++);\n}\n\nfunction writeVarint32(val, buf, pos) {\n while (val > 127) {\n buf[pos++] = val & 127 | 128;\n val >>>= 7;\n }\n buf[pos] = val;\n return pos + 1;\n}\n\n/**\n * Writes an unsigned 32 bit value as a varint.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.uint32 = function write_uint32(value) {\n value = value >>> 0;\n this._reserve(5);\n var pos = this.pos;\n this.pos = writeVarint32(value, this.buf, pos);\n return this;\n};\n\n/**\n * Writes a signed 32 bit value as a varint.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.int32 = function write_int32(value) {\n if ((value |= 0) < 0) { // 10 bytes per spec\n this._reserve(10);\n writeVarint64(LongBits.fromNumber(value), this.buf, this.pos);\n this.pos += 10;\n return this;\n }\n return this.uint32(value);\n};\n\n/**\n * Writes a 32 bit value as a varint, zig-zag encoded.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sint32 = function write_sint32(value) {\n return this.uint32((value << 1 ^ value >> 31) >>> 0);\n};\n\nfunction writeVarint64(val, buf, pos) {\n var lo = val.lo,\n hi = val.hi;\n while (hi) {\n buf[pos++] = lo & 127 | 128;\n lo = (lo >>> 7 | hi << 25) >>> 0;\n hi >>>= 7;\n }\n while (lo > 127) {\n buf[pos++] = lo & 127 | 128;\n lo = lo >>> 7;\n }\n buf[pos] = lo;\n return pos + 1;\n}\n\n/**\n * Writes an unsigned 64 bit value as a varint.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.uint64 = function write_uint64(value) {\n var bits = LongBits.from(value);\n this._reserve(10);\n var pos = this.pos;\n this.pos = writeVarint64(bits, this.buf, pos);\n return this;\n};\n\n/**\n * Writes a signed 64 bit value as a varint.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.int64 = Writer.prototype.uint64;\n\n/**\n * Writes a signed 64 bit value as a varint, zig-zag encoded.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sint64 = function write_sint64(value) {\n var bits = LongBits.from(value).zzEncode();\n this._reserve(10);\n var pos = this.pos;\n this.pos = writeVarint64(bits, this.buf, pos);\n return this;\n};\n\n/**\n * Writes a boolish value as a varint.\n * @param {boolean} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bool = function write_bool(value) {\n this._reserve(1);\n this.buf[this.pos++] = value ? 1 : 0;\n return this;\n};\n\nfunction writeFixed32(val, buf, pos) {\n buf[pos ] = val & 255;\n buf[pos + 1] = val >>> 8 & 255;\n buf[pos + 2] = val >>> 16 & 255;\n buf[pos + 3] = val >>> 24;\n}\n\n/**\n * Writes an unsigned 32 bit value as fixed 32 bits.\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.fixed32 = function write_fixed32(value) {\n this._reserve(4);\n writeFixed32(value >>> 0, this.buf, this.pos);\n this.pos += 4;\n return this;\n};\n\n/**\n * Writes a signed 32 bit value as fixed 32 bits.\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sfixed32 = Writer.prototype.fixed32;\n\n/**\n * Writes an unsigned 64 bit value as fixed 64 bits.\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.fixed64 = function write_fixed64(value) {\n var bits = LongBits.from(value);\n this._reserve(8);\n writeFixed32(bits.lo, this.buf, this.pos);\n writeFixed32(bits.hi, this.buf, this.pos + 4);\n this.pos += 8;\n return this;\n};\n\n/**\n * Writes a signed 64 bit value as fixed 64 bits.\n * @function\n * @param {Long|number|string} value Value to write\n * @returns {Writer} `this`\n * @throws {TypeError} If `value` is a string and no long library is present.\n */\nWriter.prototype.sfixed64 = Writer.prototype.fixed64;\n\n/**\n * Writes a float (32 bit).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.float = function write_float(value) {\n this._reserve(4);\n util.float.writeFloatLE(value, this.buf, this.pos);\n this.pos += 4;\n return this;\n};\n\n/**\n * Writes a double (64 bit float).\n * @function\n * @param {number} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.double = function write_double(value) {\n this._reserve(8);\n util.float.writeDoubleLE(value, this.buf, this.pos);\n this.pos += 8;\n return this;\n};\n\n/**\n * Writes a sequence of bytes.\n * @param {Uint8Array|string} value Buffer or base64 encoded string to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bytes = function write_bytes(value) {\n var len = value.length >>> 0;\n if (!len) {\n this._reserve(1);\n this.buf[this.pos++] = 0;\n return this;\n }\n if (util.isString(value)) {\n var buf = Writer.alloc(len = base64.length(value));\n base64.decode(value, buf, 0);\n value = buf;\n }\n this.uint32(len);\n this._reserve(len);\n this.buf.set(value, this.pos);\n this.pos += len;\n return this;\n};\n\n/**\n * Writes raw bytes without a tag or length prefix.\n * @param {Uint8Array} value Raw bytes\n * @returns {Writer} `this`\n */\nWriter.prototype.raw = function write_raw(value) {\n var len = value.length >>> 0;\n if (!len)\n return this;\n this._reserve(len);\n this.buf.set(value, this.pos);\n this.pos += len;\n return this;\n};\n\n/**\n * Backfills the length varint.\n * @param {number} pos Position of reserved length byte\n * @param {number} len Length of content after length varint\n * @returns {Writer} `this`\n * @private\n */\nWriter.prototype._delim = function _delim(pos, len) {\n var n = sizeVarint32(len);\n if (n > 1)\n this.buf.copyWithin(pos + n, pos + 1, pos + 1 + len);\n writeVarint32(len, this.buf, pos);\n this.pos = pos + n + len;\n return this;\n};\n\n/**\n * Writes a string.\n * @param {string} value Value to write\n * @returns {Writer} `this`\n */\nWriter.prototype.string = function write_string(value) {\n var n = value.length;\n if (!n) {\n this._reserve(1);\n this.buf[this.pos++] = 0;\n return this;\n }\n if (n < 0x80) {\n this._reserve(n * 3 + 5); // worst case\n var lenPos = this.pos;\n return this._delim(lenPos, utf8.write(value, this.buf, lenPos + 1));\n }\n var len = utf8.length(value);\n this.uint32(len);\n this._reserve(len);\n if (len === value.length)\n writeStringAscii(value, this.buf, this.pos);\n else\n utf8.write(value, this.buf, this.pos);\n this.pos += len;\n return this;\n};\n\n/**\n * Writes an array of unsigned 32 bit values as a packed repeated field.\n * @param {number[]} value Values to write\n * @returns {Writer} `this`\n */\nWriter.prototype.uint32s = function write_uint32s(value) {\n var n = value.length;\n this._reserve(n * 5 + 5); // worst case: 5 bytes per value + length varint\n var buf = this.buf, lenPos = this.pos, p = lenPos + 1;\n for (var i = 0; i < n; ++i)\n p = writeVarint32(value[i] >>> 0, buf, p);\n return this._delim(lenPos, p - lenPos - 1);\n};\n\n/**\n * Writes an array of signed 32 bit values as a packed repeated field.\n * @param {number[]} value Values to write\n * @returns {Writer} `this`\n */\nWriter.prototype.int32s = function write_int32s(value) {\n var n = value.length;\n this._reserve(n * 10 + 5); // worst case: 10 bytes per negative value + length varint\n var buf = this.buf, lenPos = this.pos, pos = lenPos + 1, val;\n for (var i = 0; i < n; ++i) {\n if ((val = value[i] | 0) < 0) { // negatives are 10 bytes per spec\n pos = writeVarint64(LongBits.fromNumber(val), buf, pos);\n } else {\n pos = writeVarint32(val, buf, pos);\n }\n }\n return this._delim(lenPos, pos - lenPos - 1);\n};\n\n/**\n * Writes an array of 32 bit values as packed, zig-zag encoded varints.\n * @param {number[]} value Values to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sint32s = function write_sint32s(value) {\n var n = value.length;\n this._reserve(n * 5 + 5);\n var buf = this.buf, lenPos = this.pos, pos = lenPos + 1;\n for (var i = 0; i < n; ++i)\n pos = writeVarint32((value[i] << 1 ^ value[i] >> 31) >>> 0, buf, pos);\n return this._delim(lenPos, pos - lenPos - 1);\n};\n\n/**\n * Writes an array of unsigned 64 bit values as a packed repeated field.\n * @param {Array.<Long|number|string>} value Values to write\n * @returns {Writer} `this`\n */\nWriter.prototype.uint64s = function write_uint64s(value) {\n var n = value.length;\n this._reserve(n * 10 + 5);\n var buf = this.buf, lenPos = this.pos, pos = lenPos + 1;\n for (var i = 0; i < n; ++i) {\n pos = writeVarint64(LongBits.from(value[i]), buf, pos);\n }\n return this._delim(lenPos, pos - lenPos - 1);\n};\n\n/**\n * Writes an array of signed 64 bit values as a packed repeated field.\n * @function\n * @param {Array.<Long|number|string>} value Values to write\n * @returns {Writer} `this`\n */\nWriter.prototype.int64s = Writer.prototype.uint64s;\n\n/**\n * Writes an array of 64 bit values as packed, zig-zag encoded varints.\n * @param {Array.<Long|number|string>} value Values to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sint64s = function write_sint64s(value) {\n var n = value.length;\n this._reserve(n * 10 + 5);\n var buf = this.buf, lenPos = this.pos, pos = lenPos + 1;\n for (var i = 0; i < n; ++i) {\n pos = writeVarint64(LongBits.from(value[i]).zzEncode(), buf, pos);\n }\n return this._delim(lenPos, pos - lenPos - 1);\n};\n\n/**\n * Writes an array of boolish values as a packed repeated field.\n * @param {boolean[]} value Values to write\n * @returns {Writer} `this`\n */\nWriter.prototype.bools = function write_bools(value) {\n var n = value.length;\n this.uint32(n); // one byte per value\n this._reserve(n);\n var buf = this.buf, p = this.pos;\n for (var i = 0; i < n; ++i)\n buf[p++] = value[i] ? 1 : 0;\n this.pos += n;\n return this;\n};\n\n// The view allocation only pays off when amortized over enough writes\nvar VIEW_THRESHOLD_FLOAT = 16,\n VIEW_THRESHOLD_INT = 128;\n\nfunction getLazyView(writer, count, threshold) {\n var view = writer.view;\n if (view || count < threshold)\n return view;\n var buf = writer.buf;\n return writer.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n}\n\n/**\n * Writes an array of unsigned 32 bit values as packed, fixed 32 bits.\n * @param {number[]} value Values to write\n * @returns {Writer} `this`\n */\nWriter.prototype.fixed32s = function write_fixed32s(value) {\n var n = value.length, bytes = n * 4;\n this.uint32(bytes); // length is known exactly\n this._reserve(bytes);\n var p = this.pos, i, dv = getLazyView(this, n, VIEW_THRESHOLD_INT);\n if (dv)\n for (i = 0; i < n; ++i) { dv.setUint32(p, value[i] >>> 0, true); p += 4; }\n else {\n var buf = this.buf;\n for (i = 0; i < n; ++i) { writeFixed32(value[i] >>> 0, buf, p); p += 4; }\n }\n this.pos += bytes;\n return this;\n};\n\n/**\n * Writes an array of signed 32 bit values as packed, fixed 32 bits.\n * @function\n * @param {number[]} value Values to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sfixed32s = Writer.prototype.fixed32s;\n\n/**\n * Writes an array of unsigned 64 bit values as packed, fixed 64 bits.\n * @param {Array.<Long|number|string>} value Values to write\n * @returns {Writer} `this`\n */\nWriter.prototype.fixed64s = function write_fixed64s(value) {\n var n = value.length, bytes = n * 8;\n this.uint32(bytes);\n this._reserve(bytes);\n var p = this.pos, i, bits, dv = getLazyView(this, n, VIEW_THRESHOLD_INT);\n if (dv)\n for (i = 0; i < n; ++i) { bits = LongBits.from(value[i]); dv.setUint32(p, bits.lo, true); dv.setUint32(p + 4, bits.hi, true); p += 8; }\n else {\n var buf = this.buf;\n for (i = 0; i < n; ++i) { bits = LongBits.from(value[i]); writeFixed32(bits.lo, buf, p); writeFixed32(bits.hi, buf, p + 4); p += 8; }\n }\n this.pos += bytes;\n return this;\n};\n\n/**\n * Writes an array of signed 64 bit values as packed, fixed 64 bits.\n * @function\n * @param {Array.<Long|number|string>} value Values to write\n * @returns {Writer} `this`\n */\nWriter.prototype.sfixed64s = Writer.prototype.fixed64s;\n\n/**\n * Writes an array of floats (32 bit) as a packed repeated field.\n * @param {number[]} value Values to write\n * @returns {Writer} `this`\n */\nWriter.prototype.floats = function write_floats(value) {\n var n = value.length, bytes = n * 4;\n this.uint32(bytes);\n this._reserve(bytes);\n var p = this.pos, i, dv = getLazyView(this, n, VIEW_THRESHOLD_FLOAT);\n if (dv)\n for (i = 0; i < n; ++i) { dv.setFloat32(p, value[i], true); p += 4; }\n else {\n var buf = this.buf;\n for (i = 0; i < n; ++i) { util.float.writeFloatLE(value[i], buf, p); p += 4; }\n }\n this.pos += bytes;\n return this;\n};\n\n/**\n * Writes an array of doubles (64 bit float) as a packed repeated field.\n * @param {number[]} value Values to write\n * @returns {Writer} `this`\n */\nWriter.prototype.doubles = function write_doubles(value) {\n var n = value.length, bytes = n * 8;\n this.uint32(bytes);\n this._reserve(bytes);\n var p = this.pos, i, dv = getLazyView(this, n, VIEW_THRESHOLD_FLOAT);\n if (dv)\n for (i = 0; i < n; ++i) { dv.setFloat64(p, value[i], true); p += 8; }\n else {\n var buf = this.buf;\n for (i = 0; i < n; ++i) { util.float.writeDoubleLE(value[i], buf, p); p += 8; }\n }\n this.pos += bytes;\n return this;\n};\n\n/**\n * Forks this writer's state by pushing it to a stack.\n * @returns {Writer} `this`\n */\nWriter.prototype.fork = function fork() {\n this._reserve(1);\n (this.states || (this.states = [])).push(this.pos);\n this.pos += 1;\n return this;\n};\n\n/**\n * Resets this instance to the last state.\n * @returns {Writer} `this`\n */\nWriter.prototype.reset = function reset() {\n var states = this.states;\n if (states && states.length) {\n this.pos = states.pop();\n } else {\n this.pos = 0;\n }\n return this;\n};\n\n/**\n * Resets to the last state and prepends the fork state's current write length as a varint.\n * @returns {Writer} `this`\n */\nWriter.prototype.ldelim = function ldelim() {\n var states = this.states,\n len,\n vlen;\n if (states && states.length) {\n var lenPos = states.pop();\n len = this.pos - lenPos - 1;\n vlen = sizeVarint32(len);\n if (vlen > 1) { // grow the reserved single byte and shift content forward\n this._reserve(vlen - 1);\n this.buf.copyWithin(lenPos + vlen, lenPos + 1, lenPos + 1 + len);\n this.pos += vlen - 1;\n writeVarint32(len, this.buf, lenPos);\n } else {\n this.buf[lenPos] = len;\n }\n } else { // not forked: prefix the entire buffer with its length\n // TODO: Compatibility with older generated code.\n // Remove this branch in the next major release.\n len = this.pos;\n vlen = sizeVarint32(len);\n this._reserve(vlen);\n this.buf.copyWithin(vlen, 0, len);\n writeVarint32(len, this.buf, 0);\n this.pos += vlen;\n }\n return this;\n};\n\n/**\n * Finishes the write operation.\n * Returns a buffer sized to the written data by default.\n * @param {boolean} [shared=false] Whether to return a shared view instead of a unique copy\n * @returns {Uint8Array} Finished buffer\n */\nWriter.prototype.finish = function finish(shared) {\n if (shared)\n return this.buf.subarray(0, this.pos);\n var buf = this.constructor.alloc(this.pos);\n buf.set(this.buf.subarray(0, this.pos), 0);\n return buf;\n};\n\n/**\n * Finishes the write operation, writing into the provided buffer.\n * The caller must ensure that `buf` has enough space starting at `offset`\n * to hold {@link Writer#pos} bytes.\n * @param {T} buf Target buffer\n * @param {number} [offset=0] Offset to start writing at\n * @returns {T} The provided buffer\n * @template T extends Uint8Array\n */\nWriter.prototype.finishInto = function finishInto(buf, offset) {\n if (offset === undefined)\n offset = 0;\n buf.set(this.buf.subarray(0, this.pos), offset);\n return buf;\n};\n\nWriter._configure = function(BufferWriter_) {\n BufferWriter = BufferWriter_;\n Writer.create = create();\n BufferWriter._configure();\n};\n","\"use strict\";\nmodule.exports = BufferWriter;\n\n// extends Writer\nvar Writer = require(\"./writer\");\nBufferWriter.prototype = Object.create(Writer.prototype, {\n constructor: {\n value: BufferWriter,\n writable: true,\n enumerable: false,\n configurable: true\n }\n});\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer writer instance.\n * @classdesc Wire format writer using node buffers.\n * @extends Writer\n * @constructor\n */\nfunction BufferWriter() {\n Writer.call(this);\n}\n\nvar writeStringBuffer;\n\nBufferWriter._configure = function () {\n /**\n * Allocates a buffer of the specified size.\n * @function\n * @param {number} size Buffer size\n * @returns {Buffer} Buffer\n */\n BufferWriter.alloc = util.Buffer && util.Buffer.allocUnsafe;\n\n writeStringBuffer = util.Buffer && util.Buffer.prototype.utf8Write\n ? function writeStringBuffer_utf8Write(val, buf, pos) {\n return buf.utf8Write(val, pos);\n }\n : function writeStringBuffer_write(val, buf, pos) {\n return buf.write(val, pos);\n };\n};\n\n\n/**\n * @override\n */\nBufferWriter.prototype.bytes = function write_bytes_buffer(value) {\n if (util.isString(value))\n value = util.Buffer.from(value, \"base64\");\n var len = value.length >>> 0;\n this.uint32(len);\n if (len) {\n this._reserve(len);\n this.buf.set(value, this.pos);\n this.pos += len;\n }\n return this;\n};\n\n/**\n * @override\n */\nBufferWriter.prototype.string = function write_string_buffer(value) {\n var n = value.length;\n if (!n) {\n this._reserve(1);\n this.buf[this.pos++] = 0;\n return this;\n }\n if (n < 0x80) {\n this._reserve(n * 3 + 5); // worst case\n var pos = this.pos,\n buf = this.buf;\n return this._delim(pos,\n n < 40\n ? util.utf8.write(value, buf, pos + 1)\n : writeStringBuffer(value, buf, pos + 1)\n );\n }\n var len = util.Buffer.byteLength(value);\n this.uint32(len);\n this._reserve(len);\n writeStringBuffer(value, this.buf, this.pos);\n this.pos += len;\n return this;\n};\n\n\n/**\n * Finishes the write operation.\n * @name BufferWriter#finish\n * @function\n * @returns {Buffer} Finished buffer\n */\n\nBufferWriter._configure();\n","\"use strict\";\nmodule.exports = Reader;\n\nvar util = require(\"./util/minimal\");\n\nvar BufferReader; // cyclic\n\nvar LongBits = util.LongBits,\n utf8 = util.utf8;\n\n/* istanbul ignore next */\nfunction indexOutOfRange(reader, writeLength) {\n return RangeError(\"index out of range: \" + reader.pos + \" + \" + (writeLength || 1) + \" > \" + reader.len);\n}\n\n/**\n * Constructs a new reader instance using the specified buffer.\n * @classdesc Wire format reader using `Uint8Array`.\n * @constructor\n * @param {Uint8Array} buffer Buffer to read from\n */\nfunction Reader(buffer) {\n\n /**\n * Read buffer.\n * @type {Uint8Array}\n */\n this.buf = buffer;\n\n /**\n * Read buffer position.\n * @type {number}\n */\n this.pos = 0;\n\n /**\n * Read buffer length.\n * @type {number}\n */\n this.len = buffer.length;\n\n /**\n * Cached DataView for packed reads.\n * @type {DataView|null}\n */\n this.view = null;\n\n /**\n * Whether to discard unknown fields while decoding.\n * @type {boolean}\n */\n this.discardUnknown = Reader.discardUnknown;\n}\n\nfunction create_array(buffer) {\n // TODO: Remove plain array reader support in the next major release.\n if (Array.isArray(buffer))\n buffer = new Uint8Array(buffer);\n if (buffer instanceof Uint8Array)\n return new Reader(buffer);\n throw Error(\"illegal buffer\");\n}\n\nvar create = function create() {\n return util.Buffer\n ? function create_buffer_setup(buffer) {\n return (Reader.create = function create_buffer(buffer) {\n return util.Buffer.isBuffer(buffer)\n ? new BufferReader(buffer)\n /* istanbul ignore next */\n : create_array(buffer);\n })(buffer);\n }\n /* istanbul ignore next */\n : create_array;\n};\n\n/**\n * Creates a new reader using the specified buffer.\n * @function\n * @param {Uint8Array|Buffer} buffer Buffer to read from\n * @returns {Reader|BufferReader} A {@link BufferReader} if `buffer` is a Buffer, otherwise a {@link Reader}\n * @throws {Error} If `buffer` is not a valid buffer\n */\nReader.create = create();\n\n/**\n * Returns raw bytes from the backing buffer without advancing the reader.\n * @param {number} start Start offset\n * @param {number} end End offset\n * @returns {Uint8Array} Raw bytes\n */\nReader.prototype.raw = function read_raw(start, end) {\n return this.buf.subarray(start, end);\n};\n\n/**\n * Reads a varint as an unsigned 32 bit value.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.uint32 = function read_uint32() {\n var buf = this.buf,\n pos = this.pos,\n value = (buf[pos] & 127) >>> 0;\n if (buf[pos++] < 128) {\n this.pos = pos;\n return value;\n }\n value = (value | (buf[pos] & 127) << 7) >>> 0;\n if (buf[pos++] < 128) {\n this.pos = pos;\n return value;\n }\n value = (value | (buf[pos] & 127) << 14) >>> 0;\n if (buf[pos++] < 128) {\n this.pos = pos;\n return value;\n }\n value = (value | (buf[pos] & 127) << 21) >>> 0;\n if (buf[pos++] < 128) {\n this.pos = pos;\n return value;\n }\n value = (value | (buf[pos] & 15) << 28) >>> 0;\n if (buf[pos++] < 128) {\n this.pos = pos;\n return value;\n }\n\n for (var i = 0; i < 5; ++i) {\n /* istanbul ignore if */\n if (pos >= this.len) {\n this.pos = pos;\n throw indexOutOfRange(this);\n }\n if (buf[pos++] < 128) {\n this.pos = pos;\n return value;\n }\n }\n /* istanbul ignore next */\n this.pos = pos;\n throw Error(\"invalid varint encoding\");\n};\n\n/**\n * Reads a field tag.\n * @function\n * @returns {number} Tag read\n */\nReader.prototype.tag = function read_tag() {\n var buf = this.buf,\n pos = this.pos,\n value = (buf[pos] & 127) >>> 0;\n if (buf[pos++] < 128) {\n this.pos = pos;\n return value;\n }\n value = (value | (buf[pos] & 127) << 7) >>> 0;\n if (buf[pos++] < 128) {\n this.pos = pos;\n return value;\n }\n value = (value | (buf[pos] & 127) << 14) >>> 0;\n if (buf[pos++] < 128) {\n this.pos = pos;\n return value;\n }\n value = (value | (buf[pos] & 127) << 21) >>> 0;\n if (buf[pos++] < 128) {\n this.pos = pos;\n return value;\n }\n value = (value | (buf[pos] & 15) << 28) >>> 0;\n if (buf[pos] < 128 && (buf[pos] & 112) === 0) {\n this.pos = pos + 1;\n return value;\n }\n\n this.pos = pos + 1;\n throw Error(\"invalid tag encoding\");\n};\n\n/**\n * Reads a varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.int32 = function read_int32() {\n return this.uint32() | 0;\n};\n\n/**\n * Reads a zig-zag encoded varint as a signed 32 bit value.\n * @returns {number} Value read\n */\nReader.prototype.sint32 = function read_sint32() {\n var value = this.uint32();\n return value >>> 1 ^ -(value & 1) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readLongVarint() {\n // tends to deopt with local vars for octet etc.\n var bits = new LongBits(0, 0);\n var i = 0;\n if (this.len - this.pos > 4) { // fast route (lo)\n for (; i < 4; ++i) {\n // 1st..4th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n // 5th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0;\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n i = 0;\n } else {\n for (; i < 4; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 1st..4th\n bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n throw indexOutOfRange(this);\n }\n if (this.len - this.pos > 4) { // fast route (hi)\n for (; i < 5; ++i) {\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n } else {\n for (; i < 5; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n // 6th..10th\n bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0;\n if (this.buf[this.pos++] < 128)\n return bits;\n }\n }\n /* istanbul ignore next */\n throw Error(\"invalid varint encoding\");\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads a varint as a signed 64 bit value.\n * @name Reader#int64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as an unsigned 64 bit value.\n * @name Reader#uint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a zig-zag encoded varint as a signed 64 bit value.\n * @name Reader#sint64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a varint as a boolean.\n * @returns {boolean} Value read\n */\nReader.prototype.bool = function read_bool() {\n var value = false,\n b;\n for (var i = 0; i < 10; ++i) {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n b = this.buf[this.pos++];\n if (b & 127)\n value = true;\n if (b < 128)\n return value;\n }\n /* istanbul ignore next */\n throw Error(\"invalid varint encoding\");\n};\n\nfunction readFixed32_end(buf, end) { // note that this uses `end`, not `pos`\n return (buf[end - 4]\n | buf[end - 3] << 8\n | buf[end - 2] << 16\n | buf[end - 1] << 24) >>> 0;\n}\n\n/**\n * Reads fixed 32 bits as an unsigned 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.fixed32 = function read_fixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4);\n};\n\n/**\n * Reads fixed 32 bits as a signed 32 bit integer.\n * @returns {number} Value read\n */\nReader.prototype.sfixed32 = function read_sfixed32() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n return readFixed32_end(this.buf, this.pos += 4) | 0;\n};\n\n/* eslint-disable no-invalid-this */\n\nfunction readFixed64(/* this: Reader */) {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 8);\n\n return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4));\n}\n\n/* eslint-enable no-invalid-this */\n\n/**\n * Reads fixed 64 bits.\n * @name Reader#fixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads zig-zag encoded fixed 64 bits.\n * @name Reader#sfixed64\n * @function\n * @returns {Long} Value read\n */\n\n/**\n * Reads a float (32 bit) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.float = function read_float() {\n\n /* istanbul ignore if */\n if (this.pos + 4 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readFloatLE(this.buf, this.pos);\n this.pos += 4;\n return value;\n};\n\n/**\n * Reads a double (64 bit float) as a number.\n * @function\n * @returns {number} Value read\n */\nReader.prototype.double = function read_double() {\n\n /* istanbul ignore if */\n if (this.pos + 8 > this.len)\n throw indexOutOfRange(this, 4);\n\n var value = util.float.readDoubleLE(this.buf, this.pos);\n this.pos += 8;\n return value;\n};\n\n/**\n * Reads a packed repeated field of unsigned 32 bit varints.\n * @param {number[]} [array] Array to read into; a new one is created if omitted\n * @returns {number[]} Array read into\n */\nReader.prototype.uint32s = function read_uint32s(array) {\n if (array === undefined) array = [];\n var end = this.uint32() + this.pos;\n while (this.pos < end)\n array.push(this.uint32());\n return array;\n};\n\n/**\n * Reads a packed repeated field of signed 32 bit varints.\n * @param {number[]} [array] Array to read into; a new one is created if omitted\n * @returns {number[]} Array read into\n */\nReader.prototype.int32s = function read_int32s(array) {\n if (array === undefined) array = [];\n var end = this.uint32() + this.pos;\n while (this.pos < end)\n array.push(this.int32());\n return array;\n};\n\n/**\n * Reads a packed repeated field of zig-zag encoded signed 32 bit varints.\n * @param {number[]} [array] Array to read into; a new one is created if omitted\n * @returns {number[]} Array read into\n */\nReader.prototype.sint32s = function read_sint32s(array) {\n if (array === undefined) array = [];\n var end = this.uint32() + this.pos;\n while (this.pos < end)\n array.push(this.sint32());\n return array;\n};\n\n/**\n * Reads a packed repeated field of booleans.\n * @param {boolean[]} [array] Array to read into; a new one is created if omitted\n * @returns {boolean[]} Array read into\n */\nReader.prototype.bools = function read_bools(array) {\n if (array === undefined) array = [];\n var end = this.uint32() + this.pos;\n while (this.pos < end)\n array.push(this.bool());\n return array;\n};\n\n// The view allocation only pays off when amortized over enough reads\nvar VIEW_THRESHOLD_FLOAT = 8,\n VIEW_THRESHOLD_INT = 128;\n\nfunction getLazyView(reader, count, threshold) {\n var view = reader.view;\n if (view || count < threshold)\n return view;\n var buf = reader.buf;\n return reader.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n}\n\n/**\n * Reads a packed repeated field of unsigned 32 bit fixed values.\n * @param {number[]} [array] Array to read into; a new one is created if omitted\n * @returns {number[]} Array read into\n */\nReader.prototype.fixed32s = function read_fixed32s(array) {\n if (array === undefined) array = [];\n var len = this.uint32(), end = this.pos + len;\n /* istanbul ignore if */\n if (end > this.len) throw indexOutOfRange(this, len);\n var count = len >>> 2, i = array.length, pos = this.pos;\n array.length = i + count;\n var dv = getLazyView(this, count, VIEW_THRESHOLD_INT);\n if (dv)\n for (var k = 0; k < count; ++k, pos += 4) array[i++] = dv.getUint32(pos, true);\n else {\n var buf = this.buf;\n for (var j = 0; j < count; ++j, pos += 4) array[i++] = readFixed32_end(buf, pos + 4);\n }\n this.pos = pos;\n if (pos !== end) throw indexOutOfRange(this, 4);\n return array;\n};\n\n/**\n * Reads a packed repeated field of signed 32 bit fixed values.\n * @param {number[]} [array] Array to read into; a new one is created if omitted\n * @returns {number[]} Array read into\n */\nReader.prototype.sfixed32s = function read_sfixed32s(array) {\n if (array === undefined) array = [];\n var len = this.uint32(), end = this.pos + len;\n /* istanbul ignore if */\n if (end > this.len) throw indexOutOfRange(this, len);\n var count = len >>> 2, i = array.length, pos = this.pos;\n array.length = i + count;\n var dv = getLazyView(this, count, VIEW_THRESHOLD_INT);\n if (dv)\n for (var k = 0; k < count; ++k, pos += 4) array[i++] = dv.getInt32(pos, true);\n else {\n var buf = this.buf;\n for (var j = 0; j < count; ++j, pos += 4) array[i++] = readFixed32_end(buf, pos + 4) | 0;\n }\n this.pos = pos;\n if (pos !== end) throw indexOutOfRange(this, 4);\n return array;\n};\n\n/**\n * Reads a packed repeated field of floats (32 bit).\n * @param {number[]} [array] Array to read into; a new one is created if omitted\n * @returns {number[]} Array read into\n */\nReader.prototype.floats = function read_floats(array) {\n if (array === undefined) array = [];\n var len = this.uint32(), end = this.pos + len;\n /* istanbul ignore if */\n if (end > this.len) throw indexOutOfRange(this, len);\n var count = len >>> 2, i = array.length, pos = this.pos;\n array.length = i + count;\n var dv = getLazyView(this, count, VIEW_THRESHOLD_FLOAT);\n if (dv)\n for (var k = 0; k < count; ++k, pos += 4) array[i++] = dv.getFloat32(pos, true);\n else {\n var buf = this.buf;\n for (var j = 0; j < count; ++j, pos += 4) array[i++] = util.float.readFloatLE(buf, pos);\n }\n this.pos = pos;\n if (pos !== end) throw indexOutOfRange(this, 4);\n return array;\n};\n\n/**\n * Reads a packed repeated field of doubles (64 bit float).\n * @param {number[]} [array] Array to read into; a new one is created if omitted\n * @returns {number[]} Array read into\n */\nReader.prototype.doubles = function read_doubles(array) {\n if (array === undefined) array = [];\n var len = this.uint32(), end = this.pos + len;\n /* istanbul ignore if */\n if (end > this.len) throw indexOutOfRange(this, len);\n var count = len >>> 3, i = array.length, pos = this.pos;\n array.length = i + count;\n var dv = getLazyView(this, count, VIEW_THRESHOLD_FLOAT);\n if (dv)\n for (var k = 0; k < count; ++k, pos += 8) array[i++] = dv.getFloat64(pos, true);\n else {\n var buf = this.buf;\n for (var j = 0; j < count; ++j, pos += 8) array[i++] = util.float.readDoubleLE(buf, pos);\n }\n this.pos = pos;\n if (pos !== end) throw indexOutOfRange(this, 8);\n return array;\n};\n\n/**\n * Reads a packed repeated field of unsigned 64 bit varints.\n * @param {Array.<Long|number>} [array] Array to read into; a new one is created if omitted\n * @returns {Array.<Long|number>} Array read into\n */\nReader.prototype.uint64s = function read_uint64s(array) {\n if (array === undefined) array = [];\n var end = this.uint32() + this.pos;\n while (this.pos < end)\n array.push(this.uint64());\n return array;\n};\n\n/**\n * Reads a packed repeated field of signed 64 bit varints.\n * @param {Array.<Long|number>} [array] Array to read into; a new one is created if omitted\n * @returns {Array.<Long|number>} Array read into\n */\nReader.prototype.int64s = function read_int64s(array) {\n if (array === undefined) array = [];\n var end = this.uint32() + this.pos;\n while (this.pos < end)\n array.push(this.int64());\n return array;\n};\n\n/**\n * Reads a packed repeated field of zig-zag encoded signed 64 bit varints.\n * @param {Array.<Long|number>} [array] Array to read into; a new one is created if omitted\n * @returns {Array.<Long|number>} Array read into\n */\nReader.prototype.sint64s = function read_sint64s(array) {\n if (array === undefined) array = [];\n var end = this.uint32() + this.pos;\n while (this.pos < end)\n array.push(this.sint64());\n return array;\n};\n\n/**\n * Reads a packed repeated field of unsigned 64 bit fixed values.\n * @param {Array.<Long|number>} [array] Array to read into; a new one is created if omitted\n * @returns {Array.<Long|number>} Array read into\n */\nReader.prototype.fixed64s = function read_fixed64s(array) {\n if (array === undefined) array = [];\n var len = this.uint32(), end = this.pos + len, i = array.length;\n /* istanbul ignore if */\n if (end > this.len) throw indexOutOfRange(this, len);\n var count = len >>> 3;\n array.length = i + count; // 8 bytes per value, count is known\n for (var j = 0; j < count; ++j)\n array[i++] = this.fixed64();\n if (this.pos !== end) throw indexOutOfRange(this, 8);\n return array;\n};\n\n/**\n * Reads a packed repeated field of signed 64 bit fixed values.\n * @param {Array.<Long|number>} [array] Array to read into; a new one is created if omitted\n * @returns {Array.<Long|number>} Array read into\n */\nReader.prototype.sfixed64s = function read_sfixed64s(array) {\n if (array === undefined) array = [];\n var len = this.uint32(), end = this.pos + len, i = array.length;\n /* istanbul ignore if */\n if (end > this.len) throw indexOutOfRange(this, len);\n var count = len >>> 3;\n array.length = i + count; // 8 bytes per value, count is known\n for (var j = 0; j < count; ++j)\n array[i++] = this.sfixed64();\n if (this.pos !== end) throw indexOutOfRange(this, 8);\n return array;\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @returns {Uint8Array} Value read\n */\nReader.prototype.bytes = function read_bytes() {\n var length = this.uint32(),\n start = this.pos,\n end = this.pos + length;\n\n /* istanbul ignore if */\n if (end > this.len)\n throw indexOutOfRange(this, length);\n\n this.pos = end;\n return this.raw(start, end);\n};\n\n/**\n * Reads a string preceeded by its byte length as a varint.\n * @returns {string} Value read\n */\nReader.prototype.string = function read_string() {\n var length = this.uint32(),\n start = this.pos,\n end = this.pos + length;\n\n /* istanbul ignore if */\n if (end > this.len)\n throw indexOutOfRange(this, length);\n\n this.pos = end;\n return utf8.read(this.buf, start, end);\n};\n\n/**\n * Reads a string preceeded by its byte length as a varint, rejecting invalid UTF8.\n * @returns {string} Value read\n */\nReader.prototype.stringVerify = function read_string_verify() {\n var length = this.uint32(),\n start = this.pos,\n end = this.pos + length;\n\n /* istanbul ignore if */\n if (end > this.len)\n throw indexOutOfRange(this, length);\n\n this.pos = end;\n return utf8.readStrict(this.buf, start, end);\n};\n\n/**\n * Skips the specified number of bytes if specified, otherwise skips a varint.\n * @param {number} [length] Length if known, otherwise a varint is assumed\n * @returns {Reader} `this`\n */\nReader.prototype.skip = function skip(length) {\n if (typeof length === \"number\") {\n /* istanbul ignore if */\n if (this.pos + length > this.len)\n throw indexOutOfRange(this, length);\n this.pos += length;\n } else {\n do {\n /* istanbul ignore if */\n if (this.pos >= this.len)\n throw indexOutOfRange(this);\n } while (this.buf[this.pos++] & 128);\n }\n return this;\n};\n\n/**\n * Recursion limit.\n * @type {number}\n */\nReader.recursionLimit = util.recursionLimit;\n\n/**\n * Whether readers discard unknown fields while decoding.\n * @type {boolean}\n */\nReader.discardUnknown = true;\n\n/**\n * Skips the next element of the specified wire type.\n * @param {number} wireType Wire type received\n * @param {number} [depth] Depth of recursion to control nested calls; 0 if omitted\n * @param {number} [fieldNumber] Field number for validating group end tags\n * @returns {Reader} `this`\n */\nReader.prototype.skipType = function(wireType, depth, fieldNumber) {\n if (depth === undefined) depth = 0;\n if (depth > Reader.recursionLimit)\n throw Error(\"max depth exceeded\");\n if (fieldNumber === 0)\n throw Error(\"illegal tag: field number 0\");\n switch (wireType) {\n case 0:\n this.skip();\n break;\n case 1:\n this.skip(8);\n break;\n case 2:\n this.skip(this.uint32());\n break;\n case 3:\n while (true) {\n var tag = this.tag();\n var nestedField = tag >>> 3;\n wireType = tag & 7;\n if (!nestedField)\n throw Error(\"illegal tag: field number 0\");\n if (wireType === 4) {\n if (fieldNumber !== undefined && nestedField !== fieldNumber)\n throw Error(\"invalid end group tag\");\n break;\n }\n this.skipType(wireType, depth + 1, nestedField);\n }\n break;\n case 5:\n this.skip(4);\n break;\n\n /* istanbul ignore next */\n default:\n throw Error(\"invalid wire type \" + wireType + \" at offset \" + this.pos);\n }\n return this;\n};\n\nReader._configure = function(BufferReader_) {\n BufferReader = BufferReader_;\n Reader.create = create();\n BufferReader._configure();\n\n var fn = util.Long ? \"toLong\" : /* istanbul ignore next */ \"toNumber\";\n util.merge(Reader.prototype, {\n\n int64: function read_int64() {\n return readLongVarint.call(this)[fn](false);\n },\n\n uint64: function read_uint64() {\n return readLongVarint.call(this)[fn](true);\n },\n\n sint64: function read_sint64() {\n return readLongVarint.call(this).zzDecode()[fn](false);\n },\n\n fixed64: function read_fixed64() {\n return readFixed64.call(this)[fn](true);\n },\n\n sfixed64: function read_sfixed64() {\n return readFixed64.call(this)[fn](false);\n }\n\n });\n};\n","\"use strict\";\nmodule.exports = BufferReader;\n\n// extends Reader\nvar Reader = require(\"./reader\");\nBufferReader.prototype = Object.create(Reader.prototype, {\n constructor: {\n value: BufferReader,\n writable: true,\n enumerable: false,\n configurable: true\n }\n});\n\nvar util = require(\"./util/minimal\");\n\n/**\n * Constructs a new buffer reader instance.\n * @classdesc Wire format reader using node buffers.\n * @extends Reader\n * @constructor\n * @param {Buffer} buffer Buffer to read from\n */\nfunction BufferReader(buffer) {\n Reader.call(this, buffer);\n\n /**\n * Read buffer.\n * @name BufferReader#buf\n * @type {Buffer}\n */\n}\n\nBufferReader._configure = function () {\n /* istanbul ignore else */\n if (util.Buffer)\n BufferReader.prototype._slice = util.Buffer.prototype.slice;\n};\n\n/**\n * Returns raw bytes from the backing buffer without advancing the reader.\n * @name BufferReader#raw\n * @function\n * @param {number} start Start offset\n * @param {number} end End offset\n * @returns {Buffer} Raw bytes\n */\nBufferReader.prototype.raw = function read_raw_buffer(start, end) {\n return this._slice.call(this.buf, start, end);\n};\n\n/**\n * @override\n */\nBufferReader.prototype.string = function read_string_buffer() {\n var len = this.uint32(), // modifies pos\n start = this.pos,\n end = this.pos + len;\n\n /* istanbul ignore if */\n if (end > this.len)\n throw RangeError(\"index out of range: \" + this.pos + \" + \" + len + \" > \" + this.len);\n\n this.pos = end;\n return this.buf.utf8Slice\n ? this.buf.utf8Slice(start, end)\n : this.buf.toString(\"utf-8\", start, end);\n};\n\n/**\n * Reads a sequence of bytes preceeded by its length as a varint.\n * @name BufferReader#bytes\n * @function\n * @returns {Buffer} Value read\n */\n\nBufferReader._configure();\n","\"use strict\";\nmodule.exports = Service;\n\nvar util = require(\"../util/minimal\");\n\n// Extends EventEmitter\nService.prototype = Object.create(util.EventEmitter.prototype, {\n constructor: {\n value: Service,\n writable: true,\n enumerable: false,\n configurable: true\n }\n});\n\n/**\n * A service method callback as used by {@link rpc.ServiceMethod|ServiceMethod}.\n *\n * Differs from {@link RPCImplCallback} in that it is an actual callback of a service method which may not return `response = null`.\n * @typedef rpc.ServiceMethodCallback\n * @template TRes extends Message<TRes>\n * @type {function}\n * @param {Error|null} error Error, if any\n * @param {TRes} [response] Response message\n * @returns {undefined}\n */\n\n/**\n * A service method part of a {@link rpc.Service} as created by {@link Service.create}.\n * @typedef rpc.ServiceMethod\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n * @type {{\n * (request: TReq|Properties<TReq>, callback: rpc.ServiceMethodCallback<TRes>): void;\n * (request: TReq|Properties<TReq>): Promise<TRes>;\n * readonly name: string;\n * readonly path: string;\n * readonly requestType: string;\n * readonly responseType: string;\n * readonly requestStream: true|undefined;\n * readonly responseStream: true|undefined;\n * }}\n */\n\n/**\n * Constructs a new RPC service instance.\n * @classdesc An RPC service as returned by {@link Service#create}.\n * @exports rpc.Service\n * @extends util.EventEmitter\n * @constructor\n * @param {RPCImpl} rpcImpl RPC implementation\n * @param {boolean} [requestDelimited=false] Whether requests are length-delimited\n * @param {boolean} [responseDelimited=false] Whether responses are length-delimited\n */\nfunction Service(rpcImpl, requestDelimited, responseDelimited) {\n\n if (typeof rpcImpl !== \"function\")\n throw TypeError(\"rpcImpl must be a function\");\n\n util.EventEmitter.call(this);\n\n /**\n * RPC implementation. Becomes `null` once the service is ended.\n * @type {RPCImpl|null}\n */\n this.rpcImpl = rpcImpl;\n\n /**\n * Whether requests are length-delimited.\n * @type {boolean}\n */\n this.requestDelimited = Boolean(requestDelimited);\n\n /**\n * Whether responses are length-delimited.\n * @type {boolean}\n */\n this.responseDelimited = Boolean(responseDelimited);\n}\n\n/**\n * Calls a service method through {@link rpc.Service#rpcImpl|rpcImpl}.\n * @param {Method|rpc.ServiceMethod<TReq,TRes>} method Reflected or static method\n * @param {Constructor<TReq>} requestCtor Request constructor\n * @param {Constructor<TRes>} responseCtor Response constructor\n * @param {TReq|Properties<TReq>} request Request message or plain object\n * @param {rpc.ServiceMethodCallback<TRes>} callback Service callback\n * @returns {undefined}\n * @template TReq extends Message<TReq>\n * @template TRes extends Message<TRes>\n */\nService.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) {\n\n if (!request)\n throw TypeError(\"request must be specified\");\n\n var self = this;\n if (!callback)\n return util.asPromise(rpcCall, self, method, requestCtor, responseCtor, request);\n\n if (!self.rpcImpl) {\n setTimeout(function() { callback(Error(\"already ended\")); }, 0);\n return undefined;\n }\n\n try {\n return self.rpcImpl(\n method,\n requestCtor[self.requestDelimited ? \"encodeDelimited\" : \"encode\"](request).finish(),\n function rpcCallback(err, response) {\n\n if (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n\n if (response === null) {\n self.end(/* endedByRPC */ true);\n return undefined;\n }\n\n if (!(response instanceof responseCtor)) {\n try {\n response = responseCtor[self.responseDelimited ? \"decodeDelimited\" : \"decode\"](response);\n } catch (err) {\n self.emit(\"error\", err, method);\n return callback(err);\n }\n }\n\n self.emit(\"data\", response, method);\n return callback(null, response);\n }\n );\n } catch (err) {\n self.emit(\"error\", err, method);\n setTimeout(function() { callback(err); }, 0);\n return undefined;\n }\n};\n\n/**\n * Ends this service and emits the `end` event.\n * @param {boolean} [endedByRPC=false] Whether the service has been ended by the RPC implementation.\n * @returns {rpc.Service} `this`\n */\nService.prototype.end = function end(endedByRPC) {\n if (this.rpcImpl) {\n if (!endedByRPC) // signal end to rpcImpl\n this.rpcImpl(null, null, null);\n this.rpcImpl = null;\n this.emit(\"end\").off();\n }\n return this;\n};\n","\"use strict\";\n\n/**\n * Streaming RPC helpers.\n * @namespace\n */\nvar rpc = exports;\n\n/**\n * RPC implementation passed to {@link Service#create} performing a service request on network level, i.e. by utilizing http requests or websockets.\n * @typedef RPCImpl\n * @type {function}\n * @param {Method|rpc.ServiceMethod<Message<{}>,Message<{}>>} method Reflected or static method being called\n * @param {Uint8Array} requestData Request data\n * @param {RPCImplCallback} callback Callback function\n * @returns {undefined}\n * @example\n * function rpcImpl(method, requestData, callback) {\n * if (protobuf.util.lcFirst(method.name) !== \"myMethod\") // compatible with static code\n * throw Error(\"no such method\");\n * asynchronouslyObtainAResponse(requestData, function(err, responseData) {\n * callback(err, responseData);\n * });\n * }\n */\n\n/**\n * Node-style callback as used by {@link RPCImpl}.\n * @typedef RPCImplCallback\n * @type {function}\n * @param {Error|null} error Error, if any, otherwise `null`\n * @param {Uint8Array|null} [response] Response data or `null` to signal end of stream, if there hasn't been an error\n * @returns {undefined}\n */\n\nrpc.Service = require(\"./rpc/service\");\n","\"use strict\";\nmodule.exports = Object.create(null);\n\n/**\n * Named roots.\n * This is where pbjs stores generated structures (the option `-r, --root` specifies a name).\n * Can also be used manually to make roots available across modules.\n * @name roots\n * @type {Object.<string,Root>}\n * @example\n * // pbjs -r myroot -o compiled.js ...\n *\n * // in another module:\n * require(\"./compiled.js\");\n *\n * // in any subsequent module:\n * var root = protobuf.roots[\"myroot\"];\n */\n","\"use strict\";\n\n/**\n * Build type, one of `\"full\"`, `\"light\"` or `\"minimal\"`.\n * @name build\n * @type {string}\n * @const\n */\nexports.build = \"minimal\";\n\n// Serialization\nexports.Writer = require(\"./writer\");\nexports.BufferWriter = require(\"./writer_buffer\");\nexports.Reader = require(\"./reader\");\nexports.BufferReader = require(\"./reader_buffer\");\n\n// Utility\nexports.util = require(\"./util/minimal\");\nexports.rpc = require(\"./rpc\");\nexports.roots = require(\"./roots\");\nexports.configure = configure;\n\n/* istanbul ignore next */\n/**\n * Reconfigures the library according to the environment.\n * @returns {undefined}\n */\nfunction configure() {\n exports.util.LongBits._configure(exports.util.Long);\n exports.Writer._configure(exports.BufferWriter);\n exports.Reader._configure(exports.BufferReader);\n}\n\n// Set up buffer utility according to the environment\nconfigure();\n","// minimal library entry point.\n\n\"use strict\";\nmodule.exports = require(\"./src/index-minimal\");\n","/**\r\n * beCoMap v2 — high-performance indoor mapping and navigation SDK.\r\n *\r\n * Public entry point. Only the factory and types are exported — no classes,\r\n * no default export, no module-level state.\r\n */\r\nexport { createMap } from './beco-map.js';\r\nexport type { BecoMap } from './beco-map.js';\r\nexport type { BecoMapOptions } from './options.js';\r\nexport type { PolygonThemeName } from './render/polygon-theme.js';\r\nexport type { BecoMapEvents, Listener } from './events.js';\r\n// turn-by-turn step vocabulary — apps localise / draw icons from these\r\nexport type { StepAction, StepDirection, RouteStep } from './routing/segments.js';\r\nexport type { NavStepInfo } from './routing/navigation.js';\r\nexport type {\r\n VenueFacade,\r\n FloorsFacade,\r\n SearchFacade,\r\n RoutingFacade,\r\n CameraFacade,\r\n} from './facades/index.js';\r\nexport type { VenueProvider } from './data/provider.js';\r\nexport type {\r\n VenueData,\r\n VenueStats,\r\n Building,\r\n Floor,\r\n VenueLocation,\r\n Shape,\r\n Category,\r\n GraphNode,\r\n GraphEdge,\r\n MapObjectDef,\r\n LngLat,\r\n PolygonGeometry,\r\n FloorConnectionKind,\r\n} from './data/types.js';\r\nexport { Venue, buildVenue } from './data/venue-model.js';\r\nexport { MockVenueProvider } from './data/mock-provider.js';\r\nexport { RestVenueProvider } from './data/rest-provider.js';\r\nexport type { RestVenueProviderOptions } from './data/rest-provider.js';\r\n","import maplibregl from 'maplibre-gl';\r\nimport { Emitter, type BecoMapEvents, type Listener } from './events.js';\r\nimport { assertContainer, type BecoMapOptions } from './options.js';\r\nimport { VenueRenderer } from './render/venue-renderer.js';\r\nimport { resolvePolygonTheme, type PolygonThemeName } from './render/polygon-theme.js';\r\nimport type { FrameStats } from './render/render-layer.js';\r\nimport type { Venue } from './data/venue-model.js';\r\nimport { pointInRing, polygonCentroid, ringToMeters, toLngLat, createFrame } from './render/coords.js';\r\nimport { storeHeight } from './render/geometry.js';\r\nimport { FloorManager, type ViewChange } from './lod/floor-manager.js';\r\nimport { createFloorSwitcher, type FloorSwitcher } from './ui/floor-switcher.js';\r\nimport { resolveClick } from './interact/hit-test.js';\r\nimport { SearchIndex } from './search/index.js';\r\nimport { RouteService } from './routing/route-service.js';\r\nimport { buildRoute } from './routing/segments.js';\r\nimport { NavigationController } from './routing/navigation.js';\r\nimport { createRouteBar, type RouteBar } from './ui/route-bar.js';\r\nimport type { VenueLocation } from './data/types.js';\r\nimport {\r\n createCameraFacade,\r\n createFloorsFacade,\r\n createRoutingFacade,\r\n createSearchFacade,\r\n createVenueFacade,\r\n type CameraFacade,\r\n type FloorsFacade,\r\n type RoutingFacade,\r\n type SearchFacade,\r\n type VenueFacade,\r\n} from './facades/index.js';\r\n\r\n/**\r\n * The public handle returned by {@link createMap}. Everything a consumer can\r\n * do goes through this interface — the implementing class is internal.\r\n */\r\nexport interface BecoMap {\r\n /** Subscribe to an SDK event. Subscribing to `load` after the map has loaded fires immediately. */\r\n on<K extends keyof BecoMapEvents>(event: K, listener: Listener<BecoMapEvents[K]>): void;\r\n /** Unsubscribe a listener previously passed to {@link BecoMap.on}. */\r\n off<K extends keyof BecoMapEvents>(event: K, listener: Listener<BecoMapEvents[K]>): void;\r\n /** Tear down the map, its WebGL context, and all listeners. */\r\n destroy(): void;\r\n /** Debug: last frame's draw calls/triangles from the unified 3D layer. */\r\n getFrameStats(): FrameStats;\r\n /** The underlying MapLibre GL map, for advanced camera/interaction control. */\r\n getMapLibreMap(): maplibregl.Map;\r\n /**\r\n * Switch the store-polygon colour theme at runtime: `ivory` (the default\r\n * warm directory panels) or `data` (the venue's real editor / category\r\n * colours). `neutral` is a back-compat alias for `ivory`.\r\n */\r\n setPolygonTheme(theme: PolygonThemeName): void;\r\n /** Select a location programmatically (highlight + popup + `select` event). */\r\n selectLocation(locationId: string): void;\r\n /** Clear the current selection (no event; deselect event may come later). */\r\n clearSelection(): void;\r\n /** Venue data access (Phase 2). */\r\n readonly venue: VenueFacade;\r\n /** Floor selection and LOD views (Phase 4). */\r\n readonly floors: FloorsFacade;\r\n /** Location search (Phase 5). */\r\n readonly search: SearchFacade;\r\n /** Routing and navigation (Phase 6). */\r\n readonly routing: RoutingFacade;\r\n /** Camera helpers. */\r\n readonly camera: CameraFacade;\r\n}\r\n\r\n/** Inject the minimal \"name chip\" popup styling once (no box, no tail, no X). */\r\nfunction ensureChipStyle(): void {\r\n if (typeof document === 'undefined' || document.getElementById('bc-chip-style')) return;\r\n const s = document.createElement('style');\r\n s.id = 'bc-chip-style';\r\n const CHIP = '#1b1f2a';\r\n s.textContent =\r\n '.maplibregl-popup.bc-chip .maplibregl-popup-content{' +\r\n `background:${CHIP};color:#fff;padding:5px 12px;border-radius:8px;` +\r\n \"font:600 13px/1.2 system-ui,-apple-system,'Segoe UI',sans-serif;\" +\r\n 'box-shadow:0 4px 14px rgba(16,19,28,.32);white-space:nowrap;}' +\r\n '.maplibregl-popup.bc-chip .maplibregl-popup-close-button{display:none;}' +\r\n // colour the tail to match the chip, for whichever side it anchors from\r\n `.maplibregl-popup.bc-chip.maplibregl-popup-anchor-bottom .maplibregl-popup-tip,` +\r\n `.maplibregl-popup.bc-chip.maplibregl-popup-anchor-bottom-left .maplibregl-popup-tip,` +\r\n `.maplibregl-popup.bc-chip.maplibregl-popup-anchor-bottom-right .maplibregl-popup-tip{border-top-color:${CHIP};}` +\r\n `.maplibregl-popup.bc-chip.maplibregl-popup-anchor-top .maplibregl-popup-tip,` +\r\n `.maplibregl-popup.bc-chip.maplibregl-popup-anchor-top-left .maplibregl-popup-tip,` +\r\n `.maplibregl-popup.bc-chip.maplibregl-popup-anchor-top-right .maplibregl-popup-tip{border-bottom-color:${CHIP};}` +\r\n `.maplibregl-popup.bc-chip.maplibregl-popup-anchor-left .maplibregl-popup-tip{border-right-color:${CHIP};}` +\r\n `.maplibregl-popup.bc-chip.maplibregl-popup-anchor-right .maplibregl-popup-tip{border-left-color:${CHIP};}`;\r\n document.head.appendChild(s);\r\n}\r\n\r\n/** Overlay card for floor-connection instructions (the reference look: dark\r\n * rounded card, bold title, arrow + connection glyph). App-restylable via\r\n * the bc-transition-* class names; injected once. */\r\nfunction ensureTransitionStyle(): void {\r\n if (typeof document === 'undefined' || document.getElementById('bc-transition-style')) return;\r\n const s = document.createElement('style');\r\n s.id = 'bc-transition-style';\r\n s.textContent =\r\n '.bc-transition-card{position:absolute;top:14%;left:50%;transform:translateX(-50%);' +\r\n 'z-index:30;background:rgba(8,8,10,.94);color:#fff;padding:22px 30px;border-radius:14px;' +\r\n \"font:700 20px/1.3 system-ui,-apple-system,'Segoe UI',sans-serif;text-align:center;\" +\r\n 'box-shadow:0 10px 34px rgba(0,0,0,.4);pointer-events:none;}' +\r\n '.bc-transition-icons{display:flex;gap:30px;justify-content:center;margin-top:16px;}' +\r\n '.bc-transition-icons svg{width:38px;height:38px;stroke:#fff;fill:none;' +\r\n 'stroke-width:2.4;stroke-linecap:round;stroke-linejoin:round;}';\r\n document.head.appendChild(s);\r\n}\r\n\r\nfunction transitionArrowSvg(direction: 'up' | 'down'): string {\r\n return direction === 'up'\r\n ? '<svg viewBox=\"0 0 24 24\"><path d=\"M12 20V5M6 11l6-6 6 6\"/></svg>'\r\n : '<svg viewBox=\"0 0 24 24\"><path d=\"M12 4v15M6 13l6 6 6-6\"/></svg>';\r\n}\r\n\r\nfunction transitionKindSvg(kind: string): string {\r\n const k = kind.toLowerCase();\r\n if (k.includes('elevator') || k.includes('lift')) {\r\n return '<svg viewBox=\"0 0 24 24\"><rect x=\"5\" y=\"4\" width=\"14\" height=\"17\" rx=\"1.5\"/><path d=\"M9.5 10l2.5-3 2.5 3M9.5 15l2.5 3 2.5-3\"/></svg>';\r\n }\r\n if (k.includes('stair')) {\r\n return '<svg viewBox=\"0 0 24 24\"><path d=\"M4 20h4v-4h4v-4h4V8h4\"/></svg>';\r\n }\r\n // escalator (default): diagonal rail with steps\r\n return '<svg viewBox=\"0 0 24 24\"><path d=\"M4 19h3l10-11h3M7 19l10-11M10 19l7.5-8.2\"/></svg>';\r\n}\r\n\r\n/** Internal implementation — instance-scoped state only, no singletons. */\r\nclass BecoMapImpl implements BecoMap {\r\n #map: maplibregl.Map;\r\n #emitter = new Emitter<BecoMapEvents>();\r\n #loaded = false;\r\n #abort = new AbortController();\r\n #container: HTMLElement;\r\n #uiFloorSwitcher: boolean;\r\n #polygonTheme: PolygonThemeName;\r\n\r\n readonly venue: ReturnType<typeof createVenueFacade>;\r\n readonly floors: FloorsFacade;\r\n readonly search = createSearchFacade({\r\n query: async (text) => (this.#searchIndex ? this.#searchIndex.query(text) : Promise.resolve([])),\r\n byCategory: (categoryId) => this.#searchIndex?.byCategory(categoryId) ?? [],\r\n });\r\n readonly routing = createRoutingFacade({\r\n route: (from, to, options) => this.#route(from, to, options),\r\n clear: () => {\r\n this.#clearRoute();\r\n },\r\n preview: () => {\r\n this.#nav?.preview();\r\n },\r\n next: () => {\r\n this.#nav?.next();\r\n },\r\n previous: () => {\r\n this.#nav?.previous();\r\n },\r\n stepInfo: () => this.#nav?.stepInfo() ?? null,\r\n active: () => this.#nav?.active ?? false,\r\n });\r\n readonly camera = createCameraFacade({\r\n focusVenue: (options) => {\r\n this.#venueRenderer?.focusVenue(options);\r\n },\r\n focusTo: (locationId) => {\r\n this.#focusTo(locationId);\r\n },\r\n });\r\n\r\n #venueRenderer: VenueRenderer | null = null;\r\n #floorManager: FloorManager | null = null;\r\n #floorSwitcher: FloorSwitcher | null = null;\r\n #venue: Venue | null = null;\r\n #searchIndex: SearchIndex | null = null;\r\n #selected: { location: VenueLocation; floorId: string; popup: maplibregl.Popup } | null = null;\r\n #popupFollow: (() => void) | null = null;\r\n #hoveredId: string | null = null;\r\n #suppressPopupClose = false;\r\n #routeService: RouteService | null = null;\r\n #nav: NavigationController | null = null;\r\n #startMarkerMove: (() => void) | null = null;\r\n #transitionCard: HTMLElement | null = null;\r\n #transitionTimer: ReturnType<typeof setTimeout> | null = null;\r\n #uiTransitionCard = true;\r\n #routeBar: RouteBar | null = null;\r\n #uiRouteBar = true;\r\n\r\n constructor(container: HTMLElement, options: BecoMapOptions) {\r\n this.#container = container;\r\n this.#uiFloorSwitcher = options.ui?.floorSwitcher !== false;\r\n this.#uiRouteBar = options.ui?.routeBar !== false;\r\n this.#uiTransitionCard = options.ui?.transitionCard !== false;\r\n this.#polygonTheme = options.polygonTheme ?? 'ivory';\r\n this.venue = createVenueFacade({\r\n ...(options.venue?.provider ? { provider: options.venue.provider } : {}),\r\n emitter: this.#emitter,\r\n signal: this.#abort.signal,\r\n onLoaded: (venue) => {\r\n this.#attachRenderer(venue);\r\n },\r\n });\r\n this.floors = createFloorsFacade({\r\n select: (floorId) => {\r\n this.#applyChanges(this.#floorManager?.selectFloor(floorId) ?? []);\r\n },\r\n focusedBuildingId: () => this.#floorManager?.focusedBuildingId() ?? null,\r\n viewOf: (buildingId) => this.#floorManager?.viewOf(buildingId),\r\n });\r\n this.#map = new maplibregl.Map({\r\n container,\r\n center: options.center ?? [0, 0],\r\n zoom: options.zoom ?? 15,\r\n pitch: options.pitch ?? 0,\r\n bearing: options.bearing ?? 0,\r\n antialias: true,\r\n attributionControl: false,\r\n // the original beCoMap basemap (same style v1 ships), instead of a flat\r\n // colour — streets/context render underneath the venue again.\r\n style: 'https://beco-lightning-backend.s3.ap-southeast-1.amazonaws.com/styles/style.json',\r\n });\r\n this.#map.on('load', () => {\r\n // dim the whole basemap slightly so the venue reads as the subject; the\r\n // custom 3D layer is added later and therefore stays above this veil.\r\n if (!this.#map.getLayer('bc-dim')) {\r\n this.#map.addLayer({\r\n id: 'bc-dim',\r\n type: 'background',\r\n paint: { 'background-color': '#000000', 'background-opacity': 0.08 },\r\n });\r\n }\r\n this.#loaded = true;\r\n this.#emitter.emit('load', undefined);\r\n });\r\n this.#map.on('error', (e) => {\r\n const cause: unknown = (e as { error?: unknown }).error;\r\n const message = cause instanceof Error ? cause.message : 'map error';\r\n this.#emitter.emit('error', { message, cause });\r\n });\r\n }\r\n\r\n on<K extends keyof BecoMapEvents>(event: K, listener: Listener<BecoMapEvents[K]>): void {\r\n this.#emitter.on(event, listener);\r\n // Late subscribers to `load` still get the event (research Open Q3).\r\n if (event === 'load' && this.#loaded) {\r\n (listener as Listener<BecoMapEvents['load']>)(undefined);\r\n }\r\n }\r\n\r\n off<K extends keyof BecoMapEvents>(event: K, listener: Listener<BecoMapEvents[K]>): void {\r\n this.#emitter.off(event, listener);\r\n }\r\n\r\n destroy(): void {\r\n this.#abort.abort();\r\n this.#nav?.dispose();\r\n this.#nav = null;\r\n this.#routeBar?.dispose();\r\n this.#routeBar = null;\r\n this.#routeService?.dispose();\r\n this.#routeService = null;\r\n this.#floorSwitcher?.dispose();\r\n this.#floorSwitcher = null;\r\n this.#venueRenderer?.dispose();\r\n this.#venueRenderer = null;\r\n this.#map.remove();\r\n this.#emitter.removeAll();\r\n }\r\n\r\n getFrameStats(): FrameStats {\r\n return this.#venueRenderer?.getFrameStats() ?? { drawCalls: 0, triangles: 0 };\r\n }\r\n\r\n getMapLibreMap(): maplibregl.Map {\r\n return this.#map;\r\n }\r\n\r\n setPolygonTheme(theme: PolygonThemeName): void {\r\n this.#polygonTheme = theme;\r\n this.#venueRenderer?.setTheme(theme);\r\n // only meaningful when running on a flat-colour style; the basemap style\r\n // has no 'bg' layer, so the theme backdrop is a no-op there.\r\n if (this.#map.getLayer('bg')) {\r\n this.#map.setPaintProperty('bg', 'background-color', resolvePolygonTheme(theme).background);\r\n }\r\n }\r\n\r\n /** Attach the unified 3D layer, LOD manager, and floor switcher. */\r\n #attachRenderer(venue: Venue): void {\r\n this.#venueRenderer?.dispose();\r\n this.#venue = venue;\r\n const attach = (): void => {\r\n this.#venueRenderer = new VenueRenderer(this.#map, venue, this.#polygonTheme);\r\n this.#floorManager = new FloorManager(venue);\r\n this.#searchIndex = new SearchIndex(venue);\r\n this.#routeService = new RouteService(venue);\r\n if (this.#uiFloorSwitcher) {\r\n this.#floorSwitcher = createFloorSwitcher(this.#container, (floorId) => {\r\n this.floors.select(floorId);\r\n });\r\n }\r\n // initial views from the current zoom (typically all sealed)\r\n this.#applyChanges(this.#floorManager.update(this.#map.getZoom()));\r\n this.#refreshSwitcher();\r\n this.#venueRenderer.focusVenue();\r\n\r\n this.#map.on('zoom', () => {\r\n this.#applyChanges(this.#floorManager?.update(this.#map.getZoom()) ?? []);\r\n });\r\n this.#map.on('zoomend', () => {\r\n this.#applyChanges(this.#floorManager?.onZoomEnd(this.#map.getZoom()) ?? []);\r\n });\r\n this.#map.on('click', (e) => {\r\n this.#handleClick(e.point.x, e.point.y, e.lngLat.lng, e.lngLat.lat);\r\n });\r\n this.#map.on('mousemove', (e) => {\r\n this.#handleHover(e.point.x, e.point.y, e.lngLat.lng, e.lngLat.lat);\r\n });\r\n this.#map.getCanvas().addEventListener('mouseleave', () => {\r\n this.#hoveredId = null;\r\n this.#venueRenderer?.setHover(null);\r\n });\r\n };\r\n if (this.#loaded) attach();\r\n else this.#map.on('load', attach);\r\n }\r\n\r\n /** Fly to a location, opening its building/floor, and select it. */\r\n #focusTo(locationId: string): void {\r\n const location = this.#venue?.getLocation(locationId);\r\n if (!location?.floorId || !this.#venue) return;\r\n this.selectLocation(locationId);\r\n let anchor: [number, number] | null = null;\r\n if (location.nodeId) {\r\n const node = this.#venue.getNode(location.nodeId);\r\n if (node) anchor = [node.lng, node.lat];\r\n }\r\n if (!anchor && location.shapeId) {\r\n const geom = this.#venue.getShape(location.shapeId)?.geometry;\r\n const ring = geom?.type === 'Polygon' ? geom.coordinates[0] : undefined;\r\n if (ring && ring.length >= 3) {\r\n const frame = createFrame(this.#venue.center);\r\n const [cx, cy] = polygonCentroid(ringToMeters(frame, ring));\r\n anchor = toLngLat(frame, cx, cy);\r\n }\r\n }\r\n if (anchor) {\r\n this.#map.easeTo({ center: anchor, zoom: 18, pitch: 45, duration: 900 });\r\n }\r\n }\r\n\r\n /**\r\n * Resolve what's under a CSS-pixel point in TRUE 3D: cast the pick ray and\r\n * test every visible store's TOP face; the nearest hit wins. Falls back to\r\n * MapLibre's ground-plane lngLat — which also catches side-face clicks,\r\n * because a ray through a store's side exits through its footprint. Without\r\n * this, extruded stores were only clickable at their label (the ground\r\n * point at pitch lands BEHIND the extrusion).\r\n */\r\n #resolveAt(px: number, py: number, lng: number, lat: number): ReturnType<typeof resolveClick> {\r\n if (!this.#venue || !this.#floorManager) return { kind: 'outdoor' };\r\n const ground = resolveClick(this.#venue, (id) => this.#floorManager?.viewOf(id), lng, lat);\r\n const ray = this.#venueRenderer?.pickRay(px, py);\r\n if (!ray || Math.abs(ray.dir.z) < 1e-9) return ground;\r\n const theme = resolvePolygonTheme(this.#polygonTheme);\r\n const frame = createFrame(this.#venue.center);\r\n let best: { t: number; target: ReturnType<typeof resolveClick> } | null = null;\r\n for (const building of this.#venue.buildings) {\r\n const view = this.#floorManager.viewOf(building.id);\r\n if (!view?.open) continue;\r\n const floor = building.floors.find((f) => f.id === view.floorId);\r\n if (!floor) continue;\r\n const locByShape = new Map(\r\n floor.locations.filter((l) => l.shapeId && !l.hidden).map((l) => [l.shapeId, l]),\r\n );\r\n for (const shape of floor.shapes) {\r\n if (shape.geometry.type !== 'Polygon') continue;\r\n const location = locByShape.get(shape.id);\r\n if (!location) continue;\r\n const h = theme.panel?.uniformHeight ?? shape.style?.height ?? storeHeight(shape.id);\r\n if (h <= 0.2) continue; // flat zones: the ground pass already resolves them\r\n const topZ = 0.6 + h;\r\n const t = (topZ - ray.origin.z) / ray.dir.z;\r\n if (t <= 0) continue;\r\n const hx = ray.origin.x + ray.dir.x * t;\r\n const hy = ray.origin.y + ray.dir.y * t;\r\n const [hLng, hLat] = toLngLat(frame, hx, hy);\r\n const ring = shape.geometry.coordinates[0];\r\n if (ring && ring.length >= 3 && pointInRing(ring, hLng, hLat)) {\r\n if (!best || t < best.t) {\r\n best = {\r\n t,\r\n target: { kind: 'store', buildingId: building.id, floorId: floor.id, location, shape },\r\n };\r\n }\r\n }\r\n }\r\n }\r\n return best ? best.target : ground;\r\n }\r\n\r\n /** POC click rules: sealed→open+fly · store→select · corridor→focus · outdoor→clear. */\r\n #handleClick(px: number, py: number, lng: number, lat: number): void {\r\n if (!this.#venue || !this.#floorManager) return;\r\n const target = this.#resolveAt(px, py, lng, lat);\r\n switch (target.kind) {\r\n case 'sealed': {\r\n this.#applyChanges(this.#floorManager.clickOpen(target.buildingId));\r\n this.#refreshSwitcher();\r\n let cx = 0;\r\n let cy = 0;\r\n for (const p of target.ring) {\r\n cx += p[0];\r\n cy += p[1];\r\n }\r\n this.#map.flyTo({\r\n center: [cx / target.ring.length, cy / target.ring.length],\r\n zoom: 17,\r\n pitch: 55,\r\n duration: 1400,\r\n });\r\n break;\r\n }\r\n case 'store':\r\n if (this.#nav?.active) break; // ROUT-07: inert while navigating\r\n this.#select(target.location);\r\n this.#floorManager.focusBuilding(target.buildingId);\r\n this.#refreshSwitcher();\r\n break;\r\n case 'corridor':\r\n // focus without clearing the selection (POC rule)\r\n this.#floorManager.focusBuilding(target.buildingId);\r\n this.#refreshSwitcher();\r\n break;\r\n case 'outdoor':\r\n if (!this.#nav?.active) this.clearSelection();\r\n break;\r\n }\r\n }\r\n\r\n /** Hover: cursor + a light glaze over the store under the pointer. */\r\n #handleHover(px: number, py: number, lng: number, lat: number): void {\r\n if (!this.#venue || !this.#floorManager) return;\r\n const target = this.#resolveAt(px, py, lng, lat);\r\n this.#map.getCanvas().style.cursor =\r\n target.kind === 'sealed' || target.kind === 'store' ? 'pointer' : '';\r\n // the selected store already wears the selection glaze — no hover on top\r\n const hovered =\r\n target.kind === 'store' &&\r\n !this.#nav?.active &&\r\n target.location.id !== this.#selected?.location.id\r\n ? target.location\r\n : null;\r\n if ((hovered?.id ?? null) === this.#hoveredId) return;\r\n this.#hoveredId = hovered?.id ?? null;\r\n if (hovered?.shapeId) {\r\n const shape = this.#venue.getShape(hovered.shapeId);\r\n const ring = shape?.geometry.type === 'Polygon' ? shape.geometry.coordinates[0] : undefined;\r\n if (shape && ring && ring.length >= 3) {\r\n this.#venueRenderer?.setHover(ring, shape.style?.height ?? storeHeight(shape.id));\r\n return;\r\n }\r\n }\r\n this.#venueRenderer?.setHover(null);\r\n }\r\n\r\n selectLocation(locationId: string): void {\r\n const location = this.#venue?.getLocation(locationId);\r\n if (!location) return;\r\n if (location.floorId) {\r\n this.#applyChanges(this.#floorManager?.selectFloor(location.floorId) ?? []);\r\n }\r\n this.#select(location);\r\n this.#refreshSwitcher();\r\n }\r\n\r\n clearSelection(): void {\r\n this.#popupFollow?.();\r\n this.#popupFollow = null;\r\n if (!this.#selected) return;\r\n this.#selected.popup.remove();\r\n this.#selected = null;\r\n this.#venueRenderer?.setHighlight(null);\r\n }\r\n\r\n /** Select a location: highlight from its real polygon + popup + event. */\r\n #select(location: VenueLocation): void {\r\n if (!this.#venue || !location.floorId) return;\r\n this.clearSelection();\r\n const shape = location.shapeId ? this.#venue.getShape(location.shapeId) : undefined;\r\n let anchor: [number, number] | null = null;\r\n // the chip is pinned ABOVE the polygon: track the ROOF point (build-frame\r\n // meters + top height) and reproject it on every camera move, so the chip\r\n // stays fixed over the store instead of drifting to its ground shadow.\r\n let roof: { x: number; y: number; z: number } | null = null;\r\n if (shape && shape.geometry.type === 'Polygon') {\r\n const ring = shape.geometry.coordinates[0];\r\n if (ring && ring.length >= 3) {\r\n const height = shape.style?.height ?? storeHeight(shape.id);\r\n this.#venueRenderer?.setHighlight(ring, height);\r\n const frame = createFrame(this.#venue.center);\r\n const [cx, cy] = polygonCentroid(ringToMeters(frame, ring));\r\n anchor = toLngLat(frame, cx, cy);\r\n const theme = resolvePolygonTheme(this.#polygonTheme);\r\n const eff = theme.panel?.uniformHeight ?? height;\r\n roof = { x: cx, y: cy, z: 0.6 + Math.max(0.2, eff) + 0.1 };\r\n }\r\n }\r\n if (!anchor && location.nodeId) {\r\n const node = this.#venue.getNode(location.nodeId);\r\n if (node) anchor = [node.lng, node.lat];\r\n }\r\n if (!anchor) return;\r\n ensureChipStyle();\r\n const popup = new maplibregl.Popup({\r\n closeOnClick: false,\r\n closeButton: false,\r\n offset: 10,\r\n className: 'bc-chip',\r\n })\r\n .setLngLat(anchor)\r\n .setText(location.name)\r\n .addTo(this.#map);\r\n if (roof) {\r\n // 'render' fires AFTER the custom layer drew with the current camera, so\r\n // the projection matrix is fresh ('move' fires before and lags a frame).\r\n let lastX = NaN;\r\n let lastY = NaN;\r\n const follow = (): void => {\r\n const scr = this.#venueRenderer?.projectPoint(roof.x, roof.y, roof.z);\r\n if (!scr) return;\r\n if (Math.abs(scr.x - lastX) < 0.5 && Math.abs(scr.y - lastY) < 0.5) return;\r\n lastX = scr.x;\r\n lastY = scr.y;\r\n popup.setLngLat(this.#map.unproject([scr.x, scr.y]));\r\n };\r\n this.#map.on('render', follow);\r\n this.#popupFollow = () => {\r\n this.#map.off('render', follow);\r\n };\r\n this.#map.triggerRepaint(); // ensure a frame renders for initial placement\r\n }\r\n popup.on('close', () => {\r\n // user hit the X: clear the whole selection (programmatic hides are suppressed)\r\n if (!this.#suppressPopupClose && this.#selected?.popup === popup) {\r\n this.#popupFollow?.();\r\n this.#popupFollow = null;\r\n this.#selected = null;\r\n this.#venueRenderer?.setHighlight(null);\r\n }\r\n });\r\n this.#selected = { location, floorId: location.floorId, popup };\r\n this.#emitter.emit('select', { locationId: location.id });\r\n this.#refreshSelectionVisibility();\r\n }\r\n\r\n /** ROUT: compute, render, preview, and hand over to step navigation. */\r\n async #route(\r\n fromLocationId: string,\r\n toLocationId: string,\r\n options: { accessibleOnly?: boolean } = {},\r\n ): Promise<import('./facades/index.js').RouteInfo> {\r\n if (!this.#venue || !this.#routeService || !this.#venueRenderer || !this.#floorManager) {\r\n throw new Error('becomap: load a venue before routing');\r\n }\r\n const from = this.#venue.getLocation(fromLocationId);\r\n const to = this.#venue.getLocation(toLocationId);\r\n if (!from?.nodeId || !to?.nodeId) {\r\n throw new Error('becomap: both locations must exist and have graph nodes');\r\n }\r\n const result = await this.#routeService.findPath(from.nodeId, to.nodeId, options);\r\n if (!result) throw new Error('becomap: no route found');\r\n const built = buildRoute(this.#venue, result.path, {\r\n origin: from.name,\r\n destination: to.name,\r\n });\r\n if (!built) throw new Error('becomap: route could not be built');\r\n\r\n this.#clearRoute(false);\r\n const ribbon = this.#venueRenderer.routeRibbon();\r\n ribbon.setRoute(built.segments);\r\n // pre-build EVERY floor the route touches now, behind the camera glide —\r\n // later floor switches become pure visibility flips (no build, no texture\r\n // pop-in), which is what made mid-preview switching look glitchy.\r\n for (const seg of built.segments) {\r\n if (seg.buildingId) this.#venueRenderer.prepareFloor(seg.floorId);\r\n }\r\n ribbon.updateVisibility((floorId, buildingId) => {\r\n const view = buildingId ? this.#floorManager?.viewOf(buildingId) : undefined;\r\n return view?.open === true && view.floorId === floorId;\r\n });\r\n // start pin: v1's source artwork as a camera-billboarded quad inside the\r\n // 3D scene — constant on-screen size, but depth-tested against the venue.\r\n // The ribbon planted it in setRoute; here we feed it the map camera on\r\n // every move so it stays facing the viewer at a fixed pixel height.\r\n const startSeg = built.segments[0];\r\n const startPt2 = startSeg?.points[0];\r\n let startZ = 0.75; // just above the slab\r\n let startXY: [number, number] | null = null;\r\n if (startSeg && startPt2) {\r\n // if the start point sits inside an extruded store, stand the pin on\r\n // that store's rendered roof (a floor-level pin would be swallowed by\r\n // the store's own walls under depth testing)\r\n const startFloor = this.#venue.getFloor(startSeg.floorId);\r\n const theme = resolvePolygonTheme(this.#polygonTheme);\r\n for (const shape of startFloor?.shapes ?? []) {\r\n if (shape.geometry.type !== 'Polygon') continue;\r\n const ring = shape.geometry.coordinates[0];\r\n if (!ring || ring.length < 3 || !pointInRing(ring, startPt2[0], startPt2[1])) continue;\r\n const h = theme.panel?.uniformHeight ?? shape.style?.height ?? storeHeight(shape.id);\r\n startZ = Math.max(startZ, 0.6 + Math.max(0.2, h) + 0.05);\r\n }\r\n ribbon.setStartMarkerAltitude(startZ);\r\n const frame = createFrame(this.#venue.center);\r\n startXY = ringToMeters(frame, [startPt2])[0] ?? null;\r\n }\r\n const startLat = built.segments[0]?.points[0]?.[1] ?? 0;\r\n const cosLat = Math.cos((startLat * Math.PI) / 180);\r\n const applyStartView = (): void => {\r\n const bearing = this.#map.getBearing();\r\n const pitch = this.#map.getPitch();\r\n // metres-per-pixel MEASURED from the live projection: project two points\r\n // one metre apart along the pin's own tilted up-axis and invert the\r\n // pixel distance. Exact at any zoom/pitch/latitude — the analytic\r\n // zoom formula drifted noticeably from maplibre's actual camera.\r\n let mpp = (cosLat * 40075016.686) / (512 * Math.pow(2, this.#map.getZoom()));\r\n if (startXY) {\r\n const b = (bearing * Math.PI) / 180;\r\n const pr = (pitch * Math.PI) / 180;\r\n const dir = [Math.sin(b) * Math.cos(pr), Math.cos(b) * Math.cos(pr), Math.sin(pr)];\r\n const base = this.#venueRenderer?.projectPoint(startXY[0], startXY[1], startZ);\r\n const tip = this.#venueRenderer?.projectPoint(\r\n startXY[0] + (dir[0] ?? 0),\r\n startXY[1] + (dir[1] ?? 0),\r\n startZ + (dir[2] ?? 0),\r\n );\r\n if (base && tip) {\r\n const pxPerM = Math.hypot(tip.x - base.x, tip.y - base.y);\r\n if (pxPerM > 1e-3) mpp = 1 / pxPerM;\r\n }\r\n }\r\n ribbon.setStartMarkerView(bearing, pitch, mpp);\r\n };\r\n applyStartView();\r\n this.#startMarkerMove = applyStartView;\r\n this.#map.on('move', applyStartView);\r\n this.#map.on('render', applyStartView);\r\n if (this.#uiRouteBar) {\r\n this.#routeBar = createRouteBar(this.#container, {\r\n onPrev: () => {\r\n this.#nav?.previous();\r\n },\r\n onNext: () => {\r\n this.#nav?.next();\r\n },\r\n onClear: () => {\r\n this.#clearRoute();\r\n },\r\n });\r\n }\r\n this.#nav = new NavigationController({\r\n map: this.#map,\r\n ribbon,\r\n segments: built.segments,\r\n steps: built.steps,\r\n showFloor: (floorId) => {\r\n this.#applyChanges(this.#floorManager?.selectFloor(floorId) ?? []);\r\n },\r\n onStep: (info) => {\r\n this.#routeBar?.update(info);\r\n this.#emitter.emit('step', info);\r\n },\r\n onTransition: (t) => {\r\n this.#showTransitionCard(t);\r\n },\r\n repaint: () => {\r\n this.#venueRenderer?.repaint();\r\n },\r\n });\r\n this.#nav.start();\r\n // Stores keep full 3D height during navigation. The route stays visible\r\n // via the ribbon's ghost/x-ray pass (drawn through walls) — no flatten.\r\n this.#emitter.emit('routeChange', { routeId: `${fromLocationId}->${toLocationId}` });\r\n return { distanceMeters: Math.round(built.totalMeters), stepCount: built.steps.length };\r\n }\r\n\r\n /**\r\n * Floor-connection instruction: emits the structured `transition` event\r\n * (apps can render their own HTML from it) and, unless disabled via\r\n * `ui.transitionCard: false`, shows the built-in overlay card — plain DOM\r\n * with stable class names (`bc-transition-card`, `-title`, `-icons`) so the\r\n * app side can restyle it with CSS.\r\n */\r\n #showTransitionCard(t: { kind: string; toFloorId: string } | null): void {\r\n if (this.#transitionTimer) {\r\n clearTimeout(this.#transitionTimer);\r\n this.#transitionTimer = null;\r\n }\r\n this.#transitionCard?.remove();\r\n this.#transitionCard = null;\r\n if (!t) {\r\n this.#emitter.emit('transition', null);\r\n return;\r\n }\r\n const toFloor = this.#venue?.getFloor(t.toFloorId);\r\n const fromFloor = this.#selectedFloorLevelForTransition(t.toFloorId);\r\n const direction: 'up' | 'down' = (toFloor?.level ?? 0) >= fromFloor ? 'up' : 'down';\r\n const kindLabel = t.kind.charAt(0).toUpperCase() + t.kind.slice(1);\r\n const floorName = toFloor?.name ?? t.toFloorId;\r\n const label = `Take the ${kindLabel} to ${floorName}`;\r\n this.#emitter.emit('transition', {\r\n kind: t.kind,\r\n toFloorId: t.toFloorId,\r\n toFloorName: floorName,\r\n direction,\r\n label,\r\n });\r\n // pre-build the destination floor WHILE the card is up, so the switch\r\n // right after is a pure visibility flip instead of a build stutter\r\n this.#venueRenderer?.prepareFloor(t.toFloorId);\r\n if (!this.#uiTransitionCard) return;\r\n ensureTransitionStyle();\r\n const card = document.createElement('div');\r\n card.className = 'bc-transition-card';\r\n const arrow = transitionArrowSvg(direction);\r\n card.innerHTML =\r\n `<div class=\"bc-transition-title\"></div>` +\r\n `<div class=\"bc-transition-icons\">${arrow}${transitionKindSvg(t.kind)}${arrow}</div>`;\r\n const title = card.querySelector('.bc-transition-title');\r\n if (title) title.textContent = label; // textContent — names are venue data\r\n this.#container.appendChild(card);\r\n this.#transitionCard = card;\r\n this.#transitionTimer = setTimeout(() => {\r\n this.#showTransitionCard(null);\r\n }, 1600);\r\n }\r\n\r\n /** Level of the floor the runner is LEAVING (falls back below the target). */\r\n #selectedFloorLevelForTransition(toFloorId: string): number {\r\n const building = this.#venue?.getFloor(toFloorId)?.buildingId;\r\n const view = building ? this.#floorManager?.viewOf(building) : undefined;\r\n const current = view?.floorId ? this.#venue?.getFloor(view.floorId) : undefined;\r\n return current?.level ?? (this.#venue?.getFloor(toFloorId)?.level ?? 1) - 1;\r\n }\r\n\r\n #clearRoute(emit = true): void {\r\n const hadRoute = this.#nav !== null;\r\n this.#nav?.dispose();\r\n this.#nav = null;\r\n this.#routeBar?.dispose();\r\n this.#routeBar = null;\r\n this.#venueRenderer?.routeRibbon().clear();\r\n if (this.#startMarkerMove) {\r\n this.#map.off('move', this.#startMarkerMove);\r\n this.#map.off('render', this.#startMarkerMove);\r\n this.#startMarkerMove = null;\r\n }\r\n this.#venueRenderer?.repaint();\r\n if (emit && hadRoute) {\r\n this.#emitter.emit('step', null);\r\n this.#emitter.emit('routeChange', { routeId: null });\r\n }\r\n }\r\n\r\n /** INT-02: highlight/popup show only while the store's floor is visible. */\r\n #refreshSelectionVisibility(): void {\r\n if (!this.#selected || !this.#venue || !this.#floorManager) return;\r\n const floor = this.#venue.getFloor(this.#selected.floorId);\r\n const view = floor ? this.#floorManager.viewOf(floor.buildingId) : undefined;\r\n const visible = view?.open === true && view.floorId === this.#selected.floorId;\r\n this.#venueRenderer?.setHighlightVisible(visible);\r\n const popupOnMap = this.#selected.popup.isOpen();\r\n if (visible && !popupOnMap) this.#selected.popup.addTo(this.#map);\r\n if (!visible && popupOnMap) {\r\n // hide WITHOUT treating it as a user close\r\n this.#suppressPopupClose = true;\r\n this.#selected.popup.remove();\r\n this.#suppressPopupClose = false;\r\n }\r\n }\r\n\r\n #applyChanges(changes: ViewChange[]): void {\r\n if (!this.#venueRenderer || changes.length === 0) {\r\n if (changes.length > 0) return;\r\n this.#refreshSwitcher();\r\n return;\r\n }\r\n for (const change of changes) {\r\n this.#venueRenderer.applyView(change.buildingId, change.view);\r\n if (change.view.open) {\r\n this.#emitter.emit('floorChange', { floorId: change.view.floorId });\r\n }\r\n }\r\n this.#refreshSelectionVisibility();\r\n this.#refreshSwitcher();\r\n }\r\n\r\n #refreshSwitcher(): void {\r\n if (!this.#floorSwitcher || !this.#venue || !this.#floorManager) return;\r\n const focusedId = this.#floorManager.focusedBuildingId();\r\n const building = focusedId ? (this.#venue.getBuilding(focusedId) ?? null) : null;\r\n this.#floorSwitcher.update(building, focusedId ? this.#floorManager.viewOf(focusedId) : undefined);\r\n }\r\n}\r\n\r\n/**\r\n * Create a beCoMap instance inside the given container element.\r\n *\r\n * @example\r\n * ```ts\r\n * import { createMap } from 'becomap';\r\n * const map = createMap(document.getElementById('map')!, { zoom: 16 });\r\n * map.on('load', () => console.log('ready'));\r\n * ```\r\n */\r\nexport function createMap(container: HTMLElement, options: BecoMapOptions = {}): BecoMap {\r\n assertContainer(container);\r\n return new BecoMapImpl(container, options);\r\n}\r\n","import type { StepAction, StepDirection } from './routing/segments.js';\r\n\r\n/**\r\n * All events a {@link BecoMap} instance can emit, with their payload types.\r\n * Payload shapes are placeholders in the foundation phase and are refined as\r\n * features land (venue selection in Phase 5, routing in Phase 6).\r\n */\r\nexport interface BecoMapEvents {\r\n /** Fired once the underlying map has loaded and the SDK is ready. */\r\n load: undefined;\r\n /** Fired when a location is selected. */\r\n select: { locationId: string };\r\n /** Fired when the visible floor of a building changes. */\r\n floorChange: { floorId: string };\r\n /** Fired when the active route changes (null = route cleared). */\r\n routeChange: { routeId: string | null };\r\n /**\r\n * Fired when the route preview reaches a floor connection (null = card\r\n * should hide). Apps can consume this to render their OWN instruction UI —\r\n * the built-in card can be disabled via `ui.transitionCard: false`.\r\n */\r\n transition: {\r\n kind: string;\r\n toFloorId: string;\r\n toFloorName: string;\r\n direction: 'up' | 'down';\r\n label: string;\r\n } | null;\r\n /**\r\n * Fired whenever the active turn-by-turn step changes (null = route\r\n * cleared). Carries STRUCTURED data — `action`, `direction`, `distanceMeters`\r\n * — so apps can localise the instruction or render their own nav UI instead\r\n * of parsing `label`.\r\n */\r\n step: {\r\n index: number;\r\n total: number;\r\n label: string;\r\n action: StepAction;\r\n direction: StepDirection;\r\n distanceMeters: number;\r\n floorId: string;\r\n landmark: string | null;\r\n isFirst: boolean;\r\n isLast: boolean;\r\n } | null;\r\n /** Fired on recoverable SDK errors. */\r\n error: { message: string; cause?: unknown };\r\n}\r\n\r\n/** A listener for a single event's payload. */\r\nexport type Listener<T> = (payload: T) => void;\r\n\r\n/**\r\n * Instance-scoped typed event emitter. Deliberately tiny: no Node `events`,\r\n * no dependencies, and never a singleton — every {@link BecoMap} owns one.\r\n */\r\nexport class Emitter<TEvents extends object> {\r\n #listeners = new Map<keyof TEvents, Set<Listener<never>>>();\r\n\r\n on<K extends keyof TEvents>(event: K, listener: Listener<TEvents[K]>): void {\r\n let set = this.#listeners.get(event);\r\n if (!set) {\r\n set = new Set();\r\n this.#listeners.set(event, set);\r\n }\r\n set.add(listener);\r\n }\r\n\r\n off<K extends keyof TEvents>(event: K, listener: Listener<TEvents[K]>): void {\r\n this.#listeners.get(event)?.delete(listener);\r\n }\r\n\r\n /** Internal — not exposed on the public BecoMap interface. */\r\n emit<K extends keyof TEvents>(event: K, payload: TEvents[K]): void {\r\n const set = this.#listeners.get(event);\r\n if (!set) return;\r\n for (const listener of [...set]) (listener as Listener<TEvents[K]>)(payload);\r\n }\r\n\r\n removeAll(): void {\r\n this.#listeners.clear();\r\n }\r\n}\r\n","import type { VenueProvider } from './data/provider.js';\r\nimport type { PolygonThemeName } from './render/polygon-theme.js';\r\n\r\n/** Options accepted by {@link createMap}. All fields are optional. */\r\nexport interface BecoMapOptions {\r\n /**\r\n * Store-polygon colour theme. `ivory` (default) is the warm directory-panel\r\n * look; `data` uses the venue's real editor / category colours. `neutral`\r\n * is a back-compat alias for `ivory`.\r\n */\r\n polygonTheme?: PolygonThemeName;\r\n /** Initial map center as [lng, lat]. Defaults to [0, 0] until venue data provides one. */\r\n center?: [number, number];\r\n /** Initial zoom level. Defaults to 15. */\r\n zoom?: number;\r\n /** Initial pitch in degrees. Defaults to 0. */\r\n pitch?: number;\r\n /** Initial bearing in degrees. Defaults to 0. */\r\n bearing?: number;\r\n /** Venue data source. Without it, `map.venue.load()` rejects. */\r\n venue?: {\r\n provider: VenueProvider;\r\n };\r\n /** Built-in UI controls. */\r\n ui?: {\r\n /** Floor switcher control (default true). */\r\n floorSwitcher?: boolean;\r\n /** Route navigation bar (default true). */\r\n routeBar?: boolean;\r\n /** Built-in floor-connection instruction card (default true). Disable to\r\n * render your own HTML from the `transition` event. */\r\n transitionCard?: boolean;\r\n };\r\n}\r\n\r\n/**\r\n * Validates the container argument early with a clear error, instead of\r\n * letting MapLibre fail obscurely later.\r\n */\r\nexport function assertContainer(container: unknown): asserts container is HTMLElement {\r\n if (typeof HTMLElement === 'undefined' || !(container instanceof HTMLElement)) {\r\n throw new TypeError('becomap: createMap(container, …) requires an HTMLElement container');\r\n }\r\n}\r\n","import * as THREE from 'three';\r\nimport maplibregl from 'maplibre-gl';\r\nimport type { Building, Floor } from '../data/types.js';\r\nimport type { Venue } from '../data/venue-model.js';\r\nimport type { BuildingView } from '../lod/floor-manager.js';\r\nimport { createFrame, polygonCentroid, ringToMeters, type VenueFrame } from './coords.js';\r\nimport { addOutlineWalls, buildFloorGeometry, hashId, polygonLabelAngle } from './geometry.js';\r\nimport {\r\n createFloorLabels,\r\n createSingleLabel,\r\n labelFlipState,\r\n type FloorLabels,\r\n type SingleLabel,\r\n} from './labels.js';\r\nimport { createAmenityMarkers, type AmenityMarkers } from './markers.js';\r\nimport { loadFloorModels } from './models.js';\r\nimport { resolvePolygonTheme, type PolygonTheme, type PolygonThemeName } from './polygon-theme.js';\r\nimport { RenderLayer, type FrameStats } from './render-layer.js';\r\nimport { RouteRibbon } from './route-ribbon.js';\r\n\r\ninterface FloorEntry {\r\n group: THREE.Group;\r\n labels: FloorLabels | null;\r\n markers: AmenityMarkers | null;\r\n built: boolean;\r\n}\r\n\r\ninterface ShellEntry {\r\n group: THREE.Group;\r\n label: SingleLabel | null;\r\n}\r\n\r\n/** Map-object GLBs (escalators, travelators). Toggle to hide them venue-wide. */\r\nconst SHOW_MAP_OBJECT_MODELS = true;\r\n\r\nconst SHELL_STOREY_M = 5;\r\nconst SHELL_ROOF_PALETTE = ['#c7d2e8', '#cfe0d8', '#e8d8cd', '#d8cfe8', '#e8e0c8'];\r\n// extrusion z-scale while navigating: 4m store → ~0.5m, clears the ~0.95m ribbon\r\nconst FLATTEN_SCALE = 0.13;\r\n\r\n/**\r\n * Owns the unified 3D scene for one venue: lazy per-floor geometry (built on\r\n * first show — LOD-04 groundwork), floor visibility, label readability flip,\r\n * and lifecycle. Instance-scoped; disposed with the map.\r\n */\r\nexport class VenueRenderer {\r\n #venue: Venue;\r\n #frame: VenueFrame;\r\n #map: maplibregl.Map;\r\n #layer: RenderLayer;\r\n #root = new THREE.Group();\r\n #floors = new Map<string, FloorEntry>();\r\n #shells = new Map<string, ShellEntry>();\r\n #capMat: THREE.MeshBasicMaterial;\r\n #shellWallMat: THREE.MeshLambertMaterial;\r\n #theme: PolygonTheme;\r\n #translucentMat = new THREE.MeshLambertMaterial({\r\n vertexColors: true,\r\n transparent: true,\r\n opacity: 0.7,\r\n side: THREE.DoubleSide,\r\n });\r\n #borderMat = new THREE.LineBasicMaterial({ color: '#5a5852' });\r\n // Selection: a translucent dark glaze over the store — the selected panel reads\r\n // as a darker shade of its own colour. Unlit + depthWrite:false + polygonOffset\r\n // so it never z-fights the panel (no flicker).\r\n #highlightMat = new THREE.MeshBasicMaterial({\r\n color: '#10131c',\r\n transparent: true,\r\n opacity: 0.34,\r\n side: THREE.DoubleSide,\r\n depthWrite: false,\r\n polygonOffset: true,\r\n polygonOffsetFactor: -2,\r\n polygonOffsetUnits: -2,\r\n });\r\n #highlight: THREE.Group | null = null;\r\n // Hover: a light glaze over the store under the pointer — subtler than the\r\n // selection glaze so the two read as different states.\r\n #hoverMat = new THREE.MeshBasicMaterial({\r\n color: '#ffffff',\r\n transparent: true,\r\n opacity: 0.24,\r\n side: THREE.DoubleSide,\r\n depthWrite: false,\r\n polygonOffset: true,\r\n polygonOffsetFactor: -1,\r\n polygonOffsetUnits: -1,\r\n });\r\n #hover: THREE.Group | null = null;\r\n #routeRibbon: RouteRibbon | null = null;\r\n #labelsFlipped = false;\r\n #onCameraMove: () => void;\r\n #onRotate: () => void;\r\n // navigation flatten: 3D extrusions collapse toward a floor-plan while a\r\n // route is active so nothing occludes the path (Mappedin-style wayfinding).\r\n #floorScaleZ = 1;\r\n #floorScaleTarget = 1;\r\n #flattenRaf = 0;\r\n\r\n constructor(map: maplibregl.Map, venue: Venue, theme?: PolygonThemeName) {\r\n this.#map = map;\r\n this.#venue = venue;\r\n this.#frame = createFrame(venue.center);\r\n this.#theme = resolvePolygonTheme(theme);\r\n // UNLIT (MeshBasic) so panel tops/walls render their exact colours — a clean\r\n // flat-shaded stylised look. Lit shading muddied the bright top to grey and\r\n // washed out the top-vs-wall contrast; the wall gradient is baked into the\r\n // vertex colours instead, so we get a bright panel in a dark frame.\r\n this.#capMat = new THREE.MeshBasicMaterial({ vertexColors: true, side: THREE.DoubleSide });\r\n this.#shellWallMat = new THREE.MeshLambertMaterial({ color: '#f7f8fb', side: THREE.DoubleSide });\r\n\r\n this.#root.add(new THREE.HemisphereLight(0xffffff, 0xdde8dd, 1.15));\r\n const sun = new THREE.DirectionalLight(0xffffff, 0.8);\r\n sun.position.set(-300, -400, 600);\r\n this.#root.add(sun);\r\n this.#root.rotation.x = -Math.PI / 2; // z-up build frame → y-up map frame\r\n\r\n this.#layer = new RenderLayer(this.#root, venue.center);\r\n map.addLayer(this.#layer);\r\n\r\n // Labels are fixed to the map (rotate with it); only flip 180 degrees past\r\n // the upside-down threshold so they stay readable.\r\n this.#onRotate = () => {\r\n const flip = labelFlipState(this.#map.getBearing(), this.#labelsFlipped);\r\n if (flip === this.#labelsFlipped) return;\r\n this.#labelsFlipped = flip;\r\n for (const entry of this.#floors.values()) {\r\n entry.labels?.setFlip(flip);\r\n entry.markers?.setFlip(flip);\r\n }\r\n for (const shell of this.#shells.values()) shell.label?.setFlip(flip);\r\n this.#layer.repaint();\r\n };\r\n map.on('rotate', this.#onRotate);\r\n // floating connection pins billboard toward the viewer: they need the\r\n // camera on EVERY move (pitch counts too), not just past a flip threshold\r\n this.#onCameraMove = () => {\r\n const bearing = this.#map.getBearing();\r\n const pitch = this.#map.getPitch();\r\n for (const entry of this.#floors.values()) entry.markers?.setCameraView(bearing, pitch);\r\n };\r\n map.on('move', this.#onCameraMove);\r\n this.#labelsFlipped = labelFlipState(map.getBearing(), false);\r\n }\r\n\r\n /**\r\n * Highlight a store by its real polygon outline: extruded outline walls +\r\n * cap, teal, one reusable slot. Pass null to clear.\r\n */\r\n setHighlight(outlineLngLat: [number, number][] | null, storeHeightM = 4): void {\r\n if (this.#highlight) {\r\n this.#root.remove(this.#highlight);\r\n this.#highlight.traverse((obj) => {\r\n if (obj instanceof THREE.Mesh) (obj.geometry as THREE.BufferGeometry).dispose();\r\n });\r\n this.#highlight = null;\r\n }\r\n if (outlineLngLat) {\r\n const outline = ringToMeters(this.#frame, outlineLngLat);\r\n const group = new THREE.Group();\r\n const buf = { pos: [], nrm: [], uv: [], idx: [] } as {\r\n pos: number[];\r\n nrm: number[];\r\n uv: number[];\r\n idx: number[];\r\n };\r\n // hug the top so the glaze covers the whole panel — under a uniform-height\r\n // theme the data height is ignored, so the overlay must ignore it too\r\n const hEff = this.#theme.panel?.uniformHeight ?? storeHeightM;\r\n const z1 = 0.6 + hEff + 0.05;\r\n addOutlineWalls(buf, outline, 0.55, z1);\r\n const walls = new THREE.BufferGeometry();\r\n walls.setAttribute('position', new THREE.BufferAttribute(new Float32Array(buf.pos), 3));\r\n walls.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(buf.nrm), 3));\r\n walls.setIndex(buf.idx);\r\n group.add(new THREE.Mesh(walls, this.#highlightMat));\r\n const shape = new THREE.Shape(outline.map(([x, y]) => new THREE.Vector2(x, y)));\r\n const cap = new THREE.ShapeGeometry(shape);\r\n cap.translate(0, 0, z1);\r\n group.add(new THREE.Mesh(cap, this.#highlightMat));\r\n this.#root.add(group);\r\n this.#highlight = group;\r\n }\r\n this.#layer.repaint();\r\n }\r\n\r\n /** Hover glaze over a store's real outline; null clears. Same construction\r\n * as the selection highlight, separate slot + subtler material. */\r\n setHover(outlineLngLat: [number, number][] | null, storeHeightM = 4): void {\r\n if (this.#hover) {\r\n this.#root.remove(this.#hover);\r\n this.#hover.traverse((obj) => {\r\n if (obj instanceof THREE.Mesh) (obj.geometry as THREE.BufferGeometry).dispose();\r\n });\r\n this.#hover = null;\r\n }\r\n if (outlineLngLat) {\r\n const outline = ringToMeters(this.#frame, outlineLngLat);\r\n const group = new THREE.Group();\r\n const buf = { pos: [], nrm: [], uv: [], idx: [] } as {\r\n pos: number[];\r\n nrm: number[];\r\n uv: number[];\r\n idx: number[];\r\n };\r\n const hEff = this.#theme.panel?.uniformHeight ?? storeHeightM;\r\n const z1 = 0.6 + hEff + 0.05;\r\n addOutlineWalls(buf, outline, 0.55, z1);\r\n const walls = new THREE.BufferGeometry();\r\n walls.setAttribute('position', new THREE.BufferAttribute(new Float32Array(buf.pos), 3));\r\n walls.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(buf.nrm), 3));\r\n walls.setIndex(buf.idx);\r\n group.add(new THREE.Mesh(walls, this.#hoverMat));\r\n const shape = new THREE.Shape(outline.map(([x, y]) => new THREE.Vector2(x, y)));\r\n const cap = new THREE.ShapeGeometry(shape);\r\n cap.translate(0, 0, z1);\r\n group.add(new THREE.Mesh(cap, this.#hoverMat));\r\n this.#root.add(group);\r\n this.#hover = group;\r\n }\r\n this.#layer.repaint();\r\n }\r\n\r\n setHighlightVisible(visible: boolean): void {\r\n if (this.#highlight) {\r\n this.#highlight.visible = visible;\r\n this.#layer.repaint();\r\n }\r\n }\r\n\r\n /** Route ribbon lives in the same scene (correct occlusion, lazy init). */\r\n routeRibbon(): RouteRibbon {\r\n this.#routeRibbon ??= new RouteRibbon(this.#root, this.#frame, () => {\r\n this.#layer.repaint();\r\n });\r\n return this.#routeRibbon;\r\n }\r\n\r\n repaint(): void {\r\n this.#layer.repaint();\r\n }\r\n\r\n /**\r\n * Collapse floor extrusions toward a flat plan (flat=true) while navigating,\r\n * so tall stores can't occlude the low route ribbon; restore full 3D on\r\n * clear. Smoothly tweened.\r\n */\r\n setFlattened(flat: boolean): void {\r\n this.#floorScaleTarget = flat ? FLATTEN_SCALE : 1;\r\n if (this.#flattenRaf) return; // tween already running\r\n const tick = (): void => {\r\n const diff = this.#floorScaleTarget - this.#floorScaleZ;\r\n this.#floorScaleZ += diff * 0.18;\r\n if (Math.abs(diff) < 0.005) this.#floorScaleZ = this.#floorScaleTarget;\r\n for (const entry of this.#floors.values()) entry.group.scale.z = this.#floorScaleZ;\r\n this.#layer.repaint();\r\n if (this.#floorScaleZ !== this.#floorScaleTarget) {\r\n this.#flattenRaf = requestAnimationFrame(tick);\r\n } else {\r\n this.#flattenRaf = 0;\r\n }\r\n };\r\n this.#flattenRaf = requestAnimationFrame(tick);\r\n }\r\n\r\n #refreshRouteVisibility(): void {\r\n this.#routeRibbon?.updateVisibility(\r\n (floorId) => this.#floors.get(floorId)?.group.visible ?? false,\r\n );\r\n }\r\n\r\n /**\r\n * Apply an LOD view: sealed → shell visible, all floors hidden;\r\n * open → shell hidden, exactly the selected floor visible (built lazily).\r\n */\r\n applyView(buildingId: string, view: BuildingView): void {\r\n const building = this.#venue.getBuilding(buildingId);\r\n if (!building) return;\r\n const shell = this.#ensureShell(building);\r\n if (shell) shell.group.visible = !view.open;\r\n for (const floor of building.floors) {\r\n if (view.open && floor.id === view.floorId) {\r\n this.showFloor(floor.id);\r\n } else {\r\n this.hideFloor(floor.id);\r\n }\r\n }\r\n this.#refreshRouteVisibility();\r\n this.#layer.repaint();\r\n }\r\n\r\n /**\r\n * Pre-build a floor's geometry WITHOUT showing it — warms the cache so a\r\n * later showFloor is an instant visibility flip. Used while the floor-change\r\n * card is up, so the switch that follows never stutters.\r\n */\r\n prepareFloor(floorId: string): void {\r\n const wasVisible = this.#floors.get(floorId)?.group.visible ?? false;\r\n const entry = this.#ensureFloor(floorId);\r\n if (entry && !wasVisible) entry.group.visible = false;\r\n }\r\n\r\n /** Build (once) and show a floor. */\r\n showFloor(floorId: string): void {\r\n const entry = this.#ensureFloor(floorId);\r\n if (entry) entry.group.visible = true;\r\n this.#layer.repaint();\r\n }\r\n\r\n hideFloor(floorId: string): void {\r\n const entry = this.#floors.get(floorId);\r\n if (entry) entry.group.visible = false;\r\n this.#layer.repaint();\r\n }\r\n\r\n visibleFloorIds(): string[] {\r\n return [...this.#floors.entries()].filter(([, e]) => e.group.visible).map(([id]) => id);\r\n }\r\n\r\n /**\r\n * Switch the polygon colour theme. Colours are baked into geometry, so built\r\n * floors are disposed and the visible ones rebuilt under the new theme.\r\n */\r\n setTheme(name: PolygonThemeName): void {\r\n const theme = resolvePolygonTheme(name);\r\n if (theme.name === this.#theme.name) return;\r\n this.#theme = theme;\r\n const visible = this.visibleFloorIds();\r\n for (const [id, entry] of [...this.#floors.entries()]) {\r\n entry.labels?.dispose();\r\n entry.markers?.dispose();\r\n entry.group.traverse((obj) => {\r\n if (obj instanceof THREE.Mesh) (obj.geometry as THREE.BufferGeometry).dispose();\r\n });\r\n this.#root.remove(entry.group);\r\n this.#floors.delete(id);\r\n }\r\n for (const id of visible) this.showFloor(id);\r\n this.#refreshRouteVisibility();\r\n this.#layer.repaint();\r\n }\r\n\r\n /** True once a floor's geometry has been built (lazy-loading observability). */\r\n isFloorBuilt(floorId: string): boolean {\r\n return this.#floors.get(floorId)?.built ?? false;\r\n }\r\n\r\n /** Screen position of a build-frame point (see RenderLayer.projectPoint). */\r\n projectPoint(x: number, y: number, z: number): { x: number; y: number } | null {\r\n return this.#layer.projectPoint(x, y, z);\r\n }\r\n\r\n /** Build-frame pick ray for a CSS-pixel point (see RenderLayer.pickRay). */\r\n pickRay(px: number, py: number): { origin: THREE.Vector3; dir: THREE.Vector3 } | null {\r\n return this.#layer.pickRay(px, py);\r\n }\r\n\r\n getFrameStats(): FrameStats {\r\n return this.#layer.getFrameStats();\r\n }\r\n\r\n /** Fit the camera to the venue's building extents. */\r\n focusVenue(options: { pitch?: number; duration?: number } = {}): void {\r\n const bounds = new maplibregl.LngLatBounds();\r\n let any = false;\r\n for (const building of this.#venue.buildings) {\r\n for (const floor of building.floors) {\r\n for (const shape of floor.shapes) {\r\n if (shape.geometry.type !== 'Polygon') continue;\r\n for (const pos of shape.geometry.coordinates[0] ?? []) {\r\n bounds.extend(pos);\r\n any = true;\r\n }\r\n }\r\n }\r\n }\r\n if (!any) return;\r\n this.#map.fitBounds(bounds, {\r\n padding: 60,\r\n pitch: options.pitch ?? 45,\r\n duration: options.duration ?? 800,\r\n });\r\n }\r\n\r\n dispose(): void {\r\n cancelAnimationFrame(this.#flattenRaf);\r\n this.#map.off('rotate', this.#onRotate);\r\n this.#map.off('move', this.#onCameraMove);\r\n for (const entry of this.#floors.values()) {\r\n entry.labels?.dispose();\r\n entry.markers?.dispose();\r\n entry.group.traverse((obj) => {\r\n if (obj instanceof THREE.Mesh) (obj.geometry as THREE.BufferGeometry).dispose();\r\n });\r\n }\r\n for (const shell of this.#shells.values()) {\r\n shell.label?.dispose();\r\n shell.group.traverse((obj) => {\r\n if (obj instanceof THREE.Mesh) (obj.geometry as THREE.BufferGeometry).dispose();\r\n });\r\n }\r\n this.#routeRibbon?.dispose();\r\n if (this.#map.getLayer(this.#layer.id)) this.#map.removeLayer(this.#layer.id);\r\n this.#capMat.dispose();\r\n this.#shellWallMat.dispose();\r\n this.#translucentMat.dispose();\r\n this.#borderMat.dispose();\r\n this.#highlightMat.dispose();\r\n this.#hoverMat.dispose();\r\n }\r\n\r\n /** Sealed-building shell: plain walls + hash-colored roof + name label. */\r\n #ensureShell(building: Building): ShellEntry | undefined {\r\n let shell = this.#shells.get(building.id);\r\n if (shell) return shell;\r\n const ground = building.floors[0];\r\n const footprint = ground?.shapes.find(\r\n (s) => (s.layerId === 'footprint' || s.type.toUpperCase() === 'WALL') && s.geometry.type === 'Polygon',\r\n );\r\n const ring = footprint?.geometry.type === 'Polygon' ? footprint.geometry.coordinates[0] : undefined;\r\n if (!ring || ring.length < 3) return undefined;\r\n const outline = ringToMeters(this.#frame, ring);\r\n const height = building.floors.length * SHELL_STOREY_M + 2;\r\n\r\n const group = new THREE.Group();\r\n const buf = { pos: [], nrm: [], uv: [], idx: [] } as {\r\n pos: number[];\r\n nrm: number[];\r\n uv: number[];\r\n idx: number[];\r\n };\r\n addOutlineWalls(buf, outline, 0, height);\r\n const walls = new THREE.BufferGeometry();\r\n walls.setAttribute('position', new THREE.BufferAttribute(new Float32Array(buf.pos), 3));\r\n walls.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(buf.nrm), 3));\r\n walls.setIndex(buf.idx);\r\n group.add(new THREE.Mesh(walls, this.#shellWallMat));\r\n\r\n const roofColor = new THREE.Color(\r\n SHELL_ROOF_PALETTE[hashId(building.id) % SHELL_ROOF_PALETTE.length],\r\n );\r\n const shape = new THREE.Shape(outline.map(([x, y]) => new THREE.Vector2(x, y)));\r\n const roof = new THREE.ShapeGeometry(shape);\r\n const count = roof.attributes.position?.count ?? 0;\r\n const colors = new Float32Array(count * 3);\r\n for (let i = 0; i < count; i++) {\r\n colors[i * 3] = roofColor.r;\r\n colors[i * 3 + 1] = roofColor.g;\r\n colors[i * 3 + 2] = roofColor.b;\r\n }\r\n roof.setAttribute('color', new THREE.BufferAttribute(colors, 3));\r\n roof.translate(0, 0, height);\r\n group.add(new THREE.Mesh(roof, this.#capMat));\r\n\r\n const [cx, cy] = polygonCentroid(outline);\r\n const label = createSingleLabel(\r\n {\r\n text: building.name,\r\n x: cx,\r\n y: cy,\r\n z: height + 0.4,\r\n fontSize: 15,\r\n baseRotation: polygonLabelAngle(outline), // aligned to the building itself\r\n color: this.#theme.labelColor,\r\n },\r\n () => {\r\n this.#layer.repaint();\r\n },\r\n );\r\n label.setFlip(this.#labelsFlipped);\r\n group.add(label.object);\r\n\r\n group.visible = false;\r\n this.#root.add(group);\r\n shell = { group, label };\r\n this.#shells.set(building.id, shell);\r\n return shell;\r\n }\r\n\r\n #ensureFloor(floorId: string): FloorEntry | undefined {\r\n let entry = this.#floors.get(floorId);\r\n if (entry?.built) return entry;\r\n const floor = this.#venue.getFloor(floorId);\r\n if (!floor) return undefined;\r\n entry = { group: new THREE.Group(), labels: null, markers: null, built: false };\r\n this.#buildFloor(entry, floor);\r\n entry.built = true;\r\n entry.group.scale.z = this.#floorScaleZ; // adopt current flatten state\r\n this.#floors.set(floorId, entry);\r\n this.#root.add(entry.group);\r\n return entry;\r\n }\r\n\r\n #buildFloor(entry: FloorEntry, floor: Floor): void {\r\n const geo = buildFloorGeometry(this.#frame, floor, this.#theme);\r\n if (geo.solid) entry.group.add(new THREE.Mesh(geo.solid, this.#capMat));\r\n if (geo.translucent) entry.group.add(new THREE.Mesh(geo.translucent, this.#translucentMat));\r\n // Polygon outlines removed — the white-model look reads cleaner without them.\r\n if (geo.labelSpecs.length) {\r\n entry.labels = createFloorLabels(geo.labelSpecs, this.#theme.labelColor, () => {\r\n this.#layer.repaint();\r\n });\r\n entry.labels.setFlip(this.#labelsFlipped);\r\n entry.group.add(entry.labels.object);\r\n }\r\n // amenity markers — badges with the venue's real category/amenity icons\r\n entry.markers = createAmenityMarkers(this.#frame, floor, this.#venue.iconset, () => {\r\n this.#layer.repaint();\r\n });\r\n if (entry.markers) {\r\n entry.markers.setFlip(this.#labelsFlipped);\r\n entry.markers.setCameraView(this.#map.getBearing(), this.#map.getPitch());\r\n entry.group.add(entry.markers.object);\r\n }\r\n // GLB map objects (instanced per model URL), loaded async — never blocks.\r\n void loadFloorModels(this.#frame, this.#venue, floor.id).then((models) => {\r\n if (models) {\r\n models.visible = SHOW_MAP_OBJECT_MODELS;\r\n entry.group.add(models);\r\n this.#layer.repaint();\r\n }\r\n });\r\n }\r\n}\r\n","import type { LngLat } from '../data/types.js';\n\n/**\n * Venue-local coordinate frame: meters east/north of the venue center.\n * Geometry is built in this frame (z-up) and the render layer maps it into\n * MapLibre's mercator space each frame.\n */\nexport interface VenueFrame {\n center: LngLat;\n metersPerDegLat: number;\n metersPerDegLng: number;\n}\n\nconst M_PER_DEG_LAT = 111_320;\n\nexport function createFrame(center: LngLat): VenueFrame {\n return {\n center,\n metersPerDegLat: M_PER_DEG_LAT,\n metersPerDegLng: M_PER_DEG_LAT * Math.cos((center[1] * Math.PI) / 180),\n };\n}\n\n/** [lng, lat] → venue-local meters [xEast, yNorth]. */\nexport function toMeters(frame: VenueFrame, lngLat: LngLat): [number, number] {\n return [\n (lngLat[0] - frame.center[0]) * frame.metersPerDegLng,\n (lngLat[1] - frame.center[1]) * frame.metersPerDegLat,\n ];\n}\n\n/** Venue-local meters → [lng, lat]. */\nexport function toLngLat(frame: VenueFrame, x: number, y: number): LngLat {\n return [frame.center[0] + x / frame.metersPerDegLng, frame.center[1] + y / frame.metersPerDegLat];\n}\n\n/** Ring of [lng,lat] positions → local meters, dropping a closing duplicate. */\nexport function ringToMeters(frame: VenueFrame, ring: LngLat[]): [number, number][] {\n const pts = ring.map((p) => toMeters(frame, p));\n const first = pts[0];\n const last = pts[pts.length - 1];\n if (pts.length > 1 && first && last && Math.hypot(first[0] - last[0], first[1] - last[1]) < 0.01) {\n pts.pop();\n }\n return pts;\n}\n\n/** Area centroid (shoelace) — keeps labels inside irregular outlines. */\nexport function polygonCentroid(pts: [number, number][]): [number, number] {\n let a = 0;\n let cx = 0;\n let cy = 0;\n for (let i = 0; i < pts.length; i++) {\n const p0 = pts[i];\n const p1 = pts[(i + 1) % pts.length];\n if (!p0 || !p1) continue;\n const cross = p0[0] * p1[1] - p1[0] * p0[1];\n a += cross;\n cx += (p0[0] + p1[0]) * cross;\n cy += (p0[1] + p1[1]) * cross;\n }\n if (Math.abs(a) < 1e-9) return pts[0] ?? [0, 0];\n a *= 0.5;\n return [cx / (6 * a), cy / (6 * a)];\n}\n\n/** Point-in-ring test directly on [lng, lat] positions (raycast). */\nexport function pointInRing(ring: LngLat[], lng: number, lat: number): boolean {\n let inside = false;\n for (let i = 0, j = ring.length - 1; i < ring.length; j = i++) {\n const pi = ring[i];\n const pj = ring[j];\n if (!pi || !pj) continue;\n const [xi, yi] = pi;\n const [xj, yj] = pj;\n if (yi > lat !== yj > lat && lng < ((xj - xi) * (lat - yi)) / (yj - yi) + xi) inside = !inside;\n }\n return inside;\n}\n\n/** Absolute polygon area in m² (local meters ring). */\nexport function polygonArea(pts: [number, number][]): number {\n let a = 0;\n for (let i = 0; i < pts.length; i++) {\n const p0 = pts[i];\n const p1 = pts[(i + 1) % pts.length];\n if (!p0 || !p1) continue;\n a += p0[0] * p1[1] - p1[0] * p0[1];\n }\n return Math.abs(a / 2);\n}\n","import * as THREE from 'three';\r\nimport { mergeGeometries } from 'three/addons/utils/BufferGeometryUtils.js';\r\nimport type { Floor, Shape, VenueLocation } from '../data/types.js';\r\nimport { polygonCentroid, ringToMeters, toMeters, type VenueFrame } from './coords.js';\r\nimport type { PolygonTheme } from './polygon-theme.js';\r\n\r\n/** Theme constants (a venue style config in a later milestone). */\r\nexport const SLAB_HEIGHT = 0.6;\r\nexport const STORE_HEIGHT_MIN = 3.2;\r\nexport const STORE_HEIGHT_RANGE = 1.8;\r\nexport const WINDOW_SPACING_M = 3.6;\r\n\r\nconst FALLBACK_PALETTE = ['#93b7d4', '#f2a65e', '#f7d488', '#e8968a', '#9ccfc3'];\r\nconst SLAB_TOP = new THREE.Color('#aab3d0');\r\n\r\n/** Deterministic per-id hash for stable pseudo-random heights/colors. */\r\nexport function hashId(id: string): number {\r\n let h = 2166136261;\r\n for (let i = 0; i < id.length; i++) {\r\n h ^= id.charCodeAt(i);\r\n h = Math.imul(h, 16777619);\r\n }\r\n return h >>> 0;\r\n}\r\n\r\nexport function storeHeight(id: string): number {\r\n return STORE_HEIGHT_MIN + (hashId(id) % 1000) * (STORE_HEIGHT_RANGE / 1000);\r\n}\r\n\r\nexport function roofColorFor(location: VenueLocation | undefined, shapeId: string): THREE.Color {\r\n const hex = location?.categories[0]?.colorHex;\r\n if (hex) return new THREE.Color(hex);\r\n return new THREE.Color(FALLBACK_PALETTE[hashId(shapeId) % FALLBACK_PALETTE.length]);\r\n}\r\n\r\ninterface WallBuffers {\r\n pos: number[];\r\n nrm: number[];\r\n uv: number[];\r\n idx: number[];\r\n}\r\n\r\n/**\r\n * Walls along an arbitrary polygon outline: one quad per segment, with u\r\n * accumulating by real length so the facade tiles continuously around\r\n * corners and curves (POC-validated technique).\r\n */\r\nexport function addOutlineWalls(\r\n buf: WallBuffers,\r\n outline: [number, number][],\r\n z0: number,\r\n z1: number,\r\n): void {\r\n let u = 0;\r\n for (let i = 0; i < outline.length; i++) {\r\n const p0 = outline[i];\r\n const p1 = outline[(i + 1) % outline.length];\r\n if (!p0 || !p1) continue;\r\n const len = Math.hypot(p1[0] - p0[0], p1[1] - p0[1]);\r\n if (len < 0.05) continue;\r\n const nx = (p1[1] - p0[1]) / len;\r\n const ny = -(p1[0] - p0[0]) / len;\r\n const base = buf.pos.length / 3;\r\n buf.pos.push(p0[0], p0[1], z0, p1[0], p1[1], z0, p1[0], p1[1], z1, p0[0], p0[1], z1);\r\n buf.nrm.push(nx, ny, 0, nx, ny, 0, nx, ny, 0, nx, ny, 0);\r\n const u1 = u + len / WINDOW_SPACING_M;\r\n buf.uv.push(u, 0, u1, 0, u1, 1, u, 1);\r\n buf.idx.push(base, base + 1, base + 2, base, base + 2, base + 3);\r\n u = u1;\r\n }\r\n}\r\n\r\nfunction wallBuffersToGeometry(buf: WallBuffers): THREE.BufferGeometry {\r\n const geo = new THREE.BufferGeometry();\r\n geo.setAttribute('position', new THREE.BufferAttribute(new Float32Array(buf.pos), 3));\r\n geo.setAttribute('normal', new THREE.BufferAttribute(new Float32Array(buf.nrm), 3));\r\n geo.setAttribute('uv', new THREE.BufferAttribute(new Float32Array(buf.uv), 2));\r\n geo.setIndex(buf.idx);\r\n return geo;\r\n}\r\n\r\nexport interface FloorGeometry {\r\n /** Everything vertex-colored & opaque (base caps/skirts, walls, roofs) — ONE draw call. */\r\n solid: THREE.BufferGeometry | null;\r\n /** Vertex-colored translucent shapes (editor opacity < 0.95) — ONE draw call. */\r\n translucent: THREE.BufferGeometry | null;\r\n /** Dark outline segments around every polygon roof — ONE draw call (LineSegments). */\r\n borders: THREE.BufferGeometry | null;\r\n /** Per-shape label anchor data for the label builder. */\r\n labelSpecs: LabelSpec[];\r\n}\r\n\r\nexport interface LabelSpec {\r\n text: string;\r\n x: number;\r\n y: number;\r\n z: number;\r\n fontSize: number;\r\n /** Base yaw (radians) aligning the text to the polygon's dominant edge. */\r\n baseRotation: number;\r\n locationId: string;\r\n /** Brand logo (PNG url from the venue data) drawn instead of the name. */\r\n logoUrl?: string;\r\n /** Box (m) the logo may fill, row-sampled so it stays INSIDE the polygon. */\r\n logoBoxW?: number;\r\n logoBoxH?: number;\r\n}\r\n\r\nexport type ShapeRole = 'base' | 'boundary' | 'partition' | 'unit';\r\n\r\n/**\r\n * What a shape IS, derived from editor type + geometry + authored height:\r\n * - WALL (Polygon outline) → 'boundary': flat floor plate (fillColor) +\r\n * perimeter wall band (color, height)\r\n * - INNER_WALL (LineString) → 'partition': centerline buffered into a\r\n * wall band (v1 buffers by ~0.8m)\r\n * - POLYGON height ≤ 0.2 → 'base': flat fill zone\r\n * - POLYGON → 'unit': extruded store\r\n */\r\nexport function shapeRole(shape: Shape): ShapeRole {\r\n if (shape.layerId === 'footprint') return 'base'; // mock convention\r\n const t = shape.type.toUpperCase();\r\n if (t === 'WALL') return 'boundary';\r\n if (t === 'INNER_WALL' || shape.geometry.type === 'LineString') return 'partition';\r\n // Editor data (style present): ONLY an explicit height > 0.2 extrudes —\r\n // missing height renders flat, exactly like v1's ['get','height'] → 0.\r\n // Mock shapes (no style) keep the legacy hashed heights.\r\n if (shape.style) {\r\n const h = shape.style.height;\r\n return h !== undefined && h > 0.2 ? 'unit' : 'base';\r\n }\r\n return 'unit';\r\n}\r\n\r\n/** Editor-authored extrusion height, with sensible per-role defaults. */\r\nexport function shapeHeight(shape: Shape, role: ShapeRole): number {\r\n const h = shape.style?.height;\r\n if (role === 'boundary' || role === 'partition') return h !== undefined && h > 0 ? h : 3;\r\n if (role === 'unit') return h ?? storeHeight(shape.id); // hash only for style-less mock shapes\r\n return 0;\r\n}\r\n\r\n/**\r\n * Top/fill color for POLYGON shapes. The editor stores the polygon fill in\r\n * `color` (NOT fillColor — that's the WALL floor plate); fall back to the\r\n * linked location's category color, then the palette.\r\n */\r\nexport function polygonTopColor(shape: Shape, location: VenueLocation | undefined): THREE.Color {\r\n if (shape.style?.color) return new THREE.Color(shape.style.color);\r\n if (shape.style?.fillColor) return new THREE.Color(shape.style.fillColor);\r\n return roofColorFor(location, shape.id);\r\n}\r\n\r\n/** v1 buffers wall centerlines by 0.0005 miles ≈ 0.8m (band ≈ 1.6m wide). */\r\nexport const WALL_BAND_HALF_WIDTH_M = 0.8;\r\n\r\n/**\r\n * A wall band along a polyline: one thin oriented box per segment (sides +\r\n * top), vertex-colored. Corners overlap slightly — same visual result as\r\n * v1's turf.buffer at these widths, without the dependency.\r\n */\r\nexport function lineBandGeometries(\r\n points: [number, number][],\r\n closed: boolean,\r\n z0: number,\r\n z1: number,\r\n half: number,\r\n color: THREE.Color,\r\n): THREE.BufferGeometry[] {\r\n const out: THREE.BufferGeometry[] = [];\r\n const count = closed ? points.length : points.length - 1;\r\n for (let i = 0; i < count; i++) {\r\n const a = points[i];\r\n const b = points[(i + 1) % points.length];\r\n if (!a || !b) continue;\r\n const dx = b[0] - a[0];\r\n const dy = b[1] - a[1];\r\n const len = Math.hypot(dx, dy);\r\n if (len < 0.05) continue;\r\n const nx = (-dy / len) * half;\r\n const ny = (dx / len) * half;\r\n // slightly extend segment ends so corners meet\r\n const ex = (dx / len) * half;\r\n const ey = (dy / len) * half;\r\n const ring: [number, number][] = [\r\n [a[0] - ex + nx, a[1] - ey + ny],\r\n [b[0] + ex + nx, b[1] + ey + ny],\r\n [b[0] + ex - nx, b[1] + ey - ny],\r\n [a[0] - ex - nx, a[1] - ey - ny],\r\n ];\r\n out.push(coloredSides([ring], z0, z1, color));\r\n out.push(capWithHoles([ring], z1, color));\r\n }\r\n return out;\r\n}\r\n\r\nconst DEFAULT_WALL_SIDE = new THREE.Color('#e7e6e1');\r\n\r\nconst LABEL_MIN_SIZE = 0.4;\r\nconst LABEL_MAX_SIZE = 2.6;\r\nconst CHAR_ADVANCE = 0.62; // troika bold advance width per char, in em\r\n\r\n/** Soft contact tone under each slab so it sits on the floor instead of floating. */\r\nconst CONTACT_SHADOW = new THREE.Color('#d9dadd');\r\nconst CONTACT_SHADOW_SPREAD_M = 0.35;\r\nconst WIDTH_FILL = 0.72; // full name should span ~72% of the store's length\r\nconst HEIGHT_FILL = 0.4; // one line of text should be ~40% of the store's thickness\r\n\r\n/**\r\n * Chord of `ring` through the point (px, py) along direction `angle`: the\r\n * distance between the two ring crossings that bracket the point. This is the\r\n * ACTUAL room a centred label has at its anchor — a bounding box lies about it\r\n * for L-shaped, diagonal, or off-centre shapes, which is exactly how long\r\n * names end up poking outside their polygons. Returns null if the point isn't\r\n * bracketed (e.g. a centroid outside a concave ring).\r\n */\r\nfunction chordSpan(\r\n ring: [number, number][],\r\n px: number,\r\n py: number,\r\n angle: number,\r\n): [number, number] | null {\r\n const dx = Math.cos(angle);\r\n const dy = Math.sin(angle);\r\n const ts: number[] = [];\r\n for (let i = 0; i < ring.length; i++) {\r\n const a = ring[i];\r\n const b = ring[(i + 1) % ring.length];\r\n if (!a || !b) continue;\r\n const ex = b[0] - a[0];\r\n const ey = b[1] - a[1];\r\n const det = ex * dy - ey * dx;\r\n if (Math.abs(det) < 1e-9) continue; // parallel\r\n const u = (dx * (a[1] - py) - dy * (a[0] - px)) / det;\r\n if (u < 0 || u > 1) continue;\r\n const t = Math.abs(dx) > Math.abs(dy) ? (a[0] + u * ex - px) / dx : (a[1] + u * ey - py) / dy;\r\n ts.push(t);\r\n }\r\n if (ts.length < 2) return null;\r\n ts.sort((p, q) => p - q);\r\n for (let i = 0; i < ts.length - 1; i++) {\r\n const t0 = ts[i];\r\n const t1 = ts[i + 1];\r\n if (t0 !== undefined && t1 !== undefined && t0 <= 0 && t1 >= 0) return [t0, t1];\r\n }\r\n return null;\r\n}\r\n\r\nfunction chordThrough(ring: [number, number][], px: number, py: number, angle: number): number | null {\r\n const span = chordSpan(ring, px, py, angle);\r\n return span ? span[1] - span[0] : null;\r\n}\r\n\r\n/**\r\n * SYMMETRIC room around the anchor: twice the distance to the NEARER edge.\r\n * A box centred on the anchor fits inside the shape only within this span —\r\n * the full chord lies about it whenever the anchor sits off-centre, which is\r\n * exactly how a centred logo pokes past the near edge of a big store.\r\n */\r\nfunction chordAround(ring: [number, number][], px: number, py: number, angle: number): number | null {\r\n const span = chordSpan(ring, px, py, angle);\r\n return span ? 2 * Math.min(-span[0], span[1]) : null;\r\n}\r\n\r\n/** Font growth per metre of the polygon's length — sizes come from the SHAPE. */\r\nconst ALONG_FILL = 0.14;\r\n\r\n/** Space index splitting `text` into two most-balanced lines, or -1. */\r\nfunction bestSplit(text: string): number {\r\n let best = -1;\r\n let bestDiff = Infinity;\r\n for (let i = 0; i < text.length; i++) {\r\n if (text[i] !== ' ') continue;\r\n const diff = Math.abs(i - (text.length - 1 - i));\r\n if (diff < bestDiff) {\r\n bestDiff = diff;\r\n best = i;\r\n }\r\n }\r\n return best;\r\n}\r\n\r\ninterface LabelFitResult {\r\n text: string;\r\n fontSize: number;\r\n rotation: number;\r\n /** The chords actually measured at the anchor — logo sizing uses these. */\r\n alongM: number;\r\n acrossM: number;\r\n}\r\n\r\n/** Fit `name` inside `ring` with text running at `angle`. Size comes from the\r\n * polygon (chords at the anchor); wrap + last-resort shrink keep it inside,\r\n * and wrapped labels re-measure the shape at each line's own row so tapering\r\n * polygons can't push a line outside. */\r\nfunction fitAtAngle(\r\n ring: [number, number][],\r\n name: string,\r\n cx: number,\r\n cy: number,\r\n angle: number,\r\n): LabelFitResult {\r\n const cos = Math.cos(-angle);\r\n const sin = Math.sin(-angle);\r\n let minU = Infinity;\r\n let maxU = -Infinity;\r\n let minV = Infinity;\r\n let maxV = -Infinity;\r\n for (const p of ring) {\r\n const u = p[0] * cos - p[1] * sin;\r\n const v = p[0] * sin + p[1] * cos;\r\n if (u < minU) minU = u;\r\n if (u > maxU) maxU = u;\r\n if (v < minV) minV = v;\r\n if (v > maxV) maxV = v;\r\n }\r\n const along = chordThrough(ring, cx, cy, angle) ?? maxU - minU;\r\n const across = chordThrough(ring, cx, cy, angle + Math.PI / 2) ?? maxV - minV;\r\n // the font size IS the polygon size, clamped to the legible band\r\n const fontSize = Math.max(\r\n LABEL_MIN_SIZE,\r\n Math.min(LABEL_MAX_SIZE, along * ALONG_FILL, across * HEIGHT_FILL),\r\n );\r\n if (name.length * CHAR_ADVANCE * fontSize <= along * WIDTH_FILL) {\r\n return { text: name, fontSize, rotation: angle, alongM: along, acrossM: across };\r\n }\r\n // One line overflows at the ceiling. Two candidates compete:\r\n // a) ONE line, shrunk just enough to fill the polygon's width\r\n // b) TWO balanced lines at up to the ceiling (row-sampled for tapers)\r\n // Wrap ONLY when it earns meaningfully bigger text — two cramped lines in a\r\n // wide strip read worse than one slightly smaller line that fills it.\r\n const oneLine = Math.max(\r\n LABEL_MIN_SIZE,\r\n Math.min(fontSize, (along * WIDTH_FILL) / (name.length * CHAR_ADVANCE)),\r\n );\r\n const split = bestSplit(name);\r\n if (split > 0) {\r\n const l1 = name.slice(0, split);\r\n const l2 = name.slice(split + 1);\r\n const maxChars = Math.max(1, l1.length, l2.length);\r\n const heightCap = (across * HEIGHT_FILL) / 2; // two lines need twice the room\r\n let twoLine = Math.max(\r\n LABEL_MIN_SIZE,\r\n Math.min(fontSize, (along * WIDTH_FILL) / (maxChars * CHAR_ADVANCE), heightCap),\r\n );\r\n // each line sits OFF the centroid, where a tapering shape may be narrower —\r\n // measure the chord at both line rows and refit against the tightest one\r\n const px = -Math.sin(angle);\r\n const py = Math.cos(angle);\r\n const off = 0.66 * twoLine; // line centres at ±~0.6 line heights\r\n const rowA = chordThrough(ring, cx + px * off, cy + py * off, angle) ?? along;\r\n const rowB = chordThrough(ring, cx - px * off, cy - py * off, angle) ?? along;\r\n const rowMin = Math.min(along, rowA, rowB);\r\n twoLine = Math.max(\r\n LABEL_MIN_SIZE,\r\n Math.min(twoLine, (rowMin * WIDTH_FILL) / (maxChars * CHAR_ADVANCE)),\r\n );\r\n if (twoLine > oneLine * 1.15) {\r\n return {\r\n text: `${l1}\r\n${l2}`,\r\n fontSize: twoLine,\r\n rotation: angle,\r\n alongM: along,\r\n acrossM: across,\r\n };\r\n }\r\n }\r\n // one line wins (or nothing to wrap): fill the width at the size that fits\r\n return { text: name, fontSize: oneLine, rotation: angle, alongM: along, acrossM: across };\r\n}\r\n\r\n/** A level-axis label at or above this size is kept without trying the other axis. */\r\nconst HORIZONTAL_OK = 0.85;\r\n\r\n/** Normalise an angle to (-PI/2, PI/2] so text never starts upside-down. */\r\nfunction normalizeTextAngle(a: number): number {\r\n while (a > Math.PI / 2) a -= Math.PI;\r\n while (a <= -Math.PI / 2) a += Math.PI;\r\n return a;\r\n}\r\n\r\n/**\r\n * Orientation is STRAIGHT BASED ON THE POLYGON: a label may only run along one\r\n * of its own store's two axes (the dominant-edge direction or its\r\n * perpendicular) — never any angle that isn't the store's own. Horizontal-\r\n * first between those two: prefer the axis closer to level, and use the\r\n * store's cross axis only when the text can't fit legibly the level way.\r\n * Labels are fixed to the venue and rotate with the map.\r\n */\r\nfunction labelFit(ring: [number, number][], text: string, cx: number, cy: number): LabelFitResult {\r\n const name = text.trim();\r\n const axisA = polygonLabelAngle(ring); // dominant edge, already in (-PI/2, PI/2]\r\n const axisB = normalizeTextAngle(axisA + Math.PI / 2); // the store's other axis\r\n // the store's \"horizontal\": whichever of its own axes is closer to level\r\n const levelAxis = Math.abs(axisA) <= Math.abs(axisB) ? axisA : axisB;\r\n const crossAxis = levelAxis === axisA ? axisB : axisA;\r\n const level = fitAtAngle(ring, name, cx, cy, levelAxis);\r\n if (level.fontSize >= HORIZONTAL_OK) return level;\r\n const cross = fitAtAngle(ring, name, cx, cy, crossAxis);\r\n return cross.fontSize > level.fontSize * 1.15 ? cross : level;\r\n}\r\n\r\n/** Fraction of the store's room a logo may fill. */\r\nconst LOGO_ALONG_FILL = 0.65;\r\nconst LOGO_ACROSS_FILL = 0.5;\r\n\r\n/**\r\n * The box a logo may occupy, centred at the anchor along the label axis. The\r\n * centroid chord alone is not enough: a concave store (notches, L-shapes) can\r\n * be wide at the centroid line yet much narrower at the logo's upper and lower\r\n * rows — so the box is row-sampled across its own height and shrunk until\r\n * every row genuinely fits inside the polygon.\r\n */\r\nfunction logoFitBox(\r\n ring: [number, number][],\r\n cx: number,\r\n cy: number,\r\n angle: number,\r\n alongM: number,\r\n acrossM: number,\r\n): { logoBoxW: number; logoBoxH: number } {\r\n // symmetric room around the anchor — a centred box must not cross the NEAR edge\r\n const cAlong = chordAround(ring, cx, cy, angle);\r\n const cAcross = chordAround(ring, cx, cy, angle + Math.PI / 2);\r\n let availW = LOGO_ALONG_FILL * (cAlong ?? alongM * 0.5);\r\n let availH = LOGO_ACROSS_FILL * (cAcross ?? acrossM * 0.5);\r\n const px = -Math.sin(angle);\r\n const py = Math.cos(angle);\r\n for (let i = 0; i < 3; i++) {\r\n const off = 0.45 * availH;\r\n const rowA = chordAround(ring, cx + px * off, cy + py * off, angle);\r\n const rowB = chordAround(ring, cx - px * off, cy - py * off, angle);\r\n if (rowA === null || rowB === null) {\r\n // a row falls outside the polygon (notch / concavity) — pull the box in\r\n availH *= 0.6;\r\n continue;\r\n }\r\n availW = Math.min(availW, LOGO_ALONG_FILL * Math.min(rowA, rowB));\r\n break;\r\n }\r\n return { logoBoxW: availW, logoBoxH: availH };\r\n}\r\n\r\n/**\r\n * Orientation (radians) of a polygon's dominant (longest) edge, normalised to\r\n * [-PI/2, PI/2] so text starts upright. Aligns the label to the polygon's own\r\n * edges — computed purely from geometry, no external rotation value — so it\r\n * reads parallel to the store instead of the world axes.\r\n */\r\nexport function polygonLabelAngle(ring: [number, number][]): number {\r\n let maxDistSq = 0;\r\n let angle = 0;\r\n for (let i = 0; i < ring.length - 1; i++) {\r\n const a = ring[i];\r\n const b = ring[i + 1];\r\n if (!a || !b) continue;\r\n const dx = b[0] - a[0];\r\n const dy = b[1] - a[1];\r\n const distSq = dx * dx + dy * dy;\r\n if (distSq > maxDistSq) {\r\n maxDistSq = distSq;\r\n angle = Math.atan2(dy, dx);\r\n }\r\n }\r\n while (angle <= -Math.PI / 2) angle += Math.PI;\r\n while (angle > Math.PI / 2) angle -= Math.PI;\r\n return angle;\r\n}\r\n\r\n/** All rings of a Polygon shape in local meters (outer + holes), with faceted\r\n * curves smoothed while sharp corners are preserved. */\r\nfunction shapeRings(frame: VenueFrame, shape: Shape): [number, number][][] {\r\n if (shape.geometry.type !== 'Polygon') return [];\r\n return shape.geometry.coordinates\r\n .map((ring) => smoothRing(ringToMeters(frame, ring)))\r\n .filter((r) => r.length >= 3);\r\n}\r\n\r\n/** Flat cap honoring holes, vertex-colored, with the uv attribute kept for merging. */\r\nfunction capWithHoles(rings: [number, number][][], z: number, color: THREE.Color): THREE.BufferGeometry {\r\n const outer = rings[0] ?? [];\r\n const shape = new THREE.Shape(outer.map(([x, y]) => new THREE.Vector2(x, y)));\r\n for (const hole of rings.slice(1)) {\r\n shape.holes.push(new THREE.Path(hole.map(([x, y]) => new THREE.Vector2(x, y))));\r\n }\r\n const geo = new THREE.ShapeGeometry(shape);\r\n const count = geo.attributes.position?.count ?? 0;\r\n const colors = new Float32Array(count * 3);\r\n for (let i = 0; i < count; i++) {\r\n colors[i * 3] = color.r;\r\n colors[i * 3 + 1] = color.g;\r\n colors[i * 3 + 2] = color.b;\r\n }\r\n geo.setAttribute('color', new THREE.BufferAttribute(colors, 3));\r\n geo.translate(0, 0, z);\r\n return geo;\r\n}\r\n\r\n/**\r\n * Fake directional light for vertical faces, BAKED into the vertex colours.\r\n * The scene renders unlit (MeshBasicMaterial keeps bright colours true), but\r\n * uniformly-coloured extrusions read as flat paper — the reference maps look\r\n * \"solid\" because every side face catches a different amount of light. N·L\r\n * against a fixed sun direction gives each face a stable tone at zero runtime\r\n * cost; caps stay at full colour, exactly like a lit scene under a high sun.\r\n */\r\nconst SUN_X = -0.55; // sun from the north-west, matching the abuzz venues\r\nconst SUN_Y = 0.835;\r\n// Keep the shading SUBTLE: on curved outlines the per-face N·L snaps between\r\n// facets, and anything stronger than a few percent reads as a dirty patch on\r\n// the side of the panel (seen on the live venue) rather than as lighting.\r\nconst SIDE_AMBIENT = 0.9; // faces away from the sun keep 90% of their colour\r\nconst SIDE_DIFFUSE = 0.1;\r\nfunction sideShade(nx: number, ny: number): number {\r\n return SIDE_AMBIENT + SIDE_DIFFUSE * Math.max(0, nx * SUN_X + ny * SUN_Y);\r\n}\r\n\r\n/** Extruded side walls for all rings, vertex-colored (for the solid bucket). */\r\nfunction coloredSides(\r\n rings: [number, number][][],\r\n z0: number,\r\n z1: number,\r\n color: THREE.Color,\r\n): THREE.BufferGeometry {\r\n const buf: WallBuffers = { pos: [], nrm: [], uv: [], idx: [] };\r\n for (const ring of rings) addOutlineWalls(buf, ring, z0, z1);\r\n const geo = wallBuffersToGeometry(buf);\r\n const count = geo.attributes.position?.count ?? 0;\r\n const nrm = geo.attributes.normal;\r\n const colors = new Float32Array(count * 3);\r\n for (let i = 0; i < count; i++) {\r\n const s = nrm ? sideShade(nrm.getX(i), nrm.getY(i)) : 1;\r\n colors[i * 3] = color.r * s;\r\n colors[i * 3 + 1] = color.g * s;\r\n colors[i * 3 + 2] = color.b * s;\r\n }\r\n geo.setAttribute('color', new THREE.BufferAttribute(colors, 3));\r\n return geo;\r\n}\r\n\r\n/**\r\n * Extruded side walls, vertex-coloured with a vertical gradient: `topColor` at\r\n * the roof line fading to the darker `baseColor` at the floor. This fakes\r\n * ambient occlusion at the base so a unit reads as a solid matte block — the\r\n * modern indoor-map look (Mappedin / Visioglobe), replacing the window facade.\r\n */\r\nfunction gradientSides(\r\n rings: [number, number][][],\r\n z0: number,\r\n z1: number,\r\n topColor: THREE.Color,\r\n baseColor: THREE.Color,\r\n): THREE.BufferGeometry {\r\n const buf: WallBuffers = { pos: [], nrm: [], uv: [], idx: [] };\r\n for (const ring of rings) addOutlineWalls(buf, ring, z0, z1);\r\n const geo = wallBuffersToGeometry(buf);\r\n const count = geo.attributes.position?.count ?? 0;\r\n const colors = new Float32Array(count * 3);\r\n const nrm = geo.attributes.normal;\r\n // addOutlineWalls emits each quad as [p0@z0, p1@z0, p1@z1, p0@z1]: within\r\n // every group of four vertices the first two sit at the base, the last two\r\n // at the top — so the gradient runs cleanly from baseColor up to topColor.\r\n // The same baked sun as coloredSides keeps every vertical face consistent.\r\n for (let i = 0; i < count; i++) {\r\n const c = i % 4 >= 2 ? topColor : baseColor;\r\n const s = nrm ? sideShade(nrm.getX(i), nrm.getY(i)) : 1;\r\n colors[i * 3] = c.r * s;\r\n colors[i * 3 + 1] = c.g * s;\r\n colors[i * 3 + 2] = c.b * s;\r\n }\r\n geo.setAttribute('color', new THREE.BufferAttribute(colors, 3));\r\n return geo;\r\n}\r\n\r\n/** Signed area (shoelace) of a ring — positive is CCW in the build frame. */\r\nfunction ringArea(ring: [number, number][]): number {\r\n let a = 0;\r\n for (let i = 0; i < ring.length; i++) {\r\n const p = ring[i];\r\n const q = ring[(i + 1) % ring.length];\r\n if (p && q) a += p[0] * q[1] - q[0] * p[1];\r\n }\r\n return a / 2;\r\n}\r\n\r\n/** Perimeter of a ring (metres). */\r\nfunction ringPerimeter(ring: [number, number][]): number {\r\n let p = 0;\r\n for (let i = 0; i < ring.length; i++) {\r\n const a = ring[i];\r\n const b = ring[(i + 1) % ring.length];\r\n if (a && b) p += Math.hypot(b[0] - a[0], b[1] - a[1]);\r\n }\r\n return p;\r\n}\r\n\r\n/**\r\n * Average \"thickness\" of a polygon (2·area / perimeter). A wide store is a few\r\n * metres; a divider/rail strip is well under a metre. Below this we treat the\r\n * shape as a thin strip and render it flat rather than extruding a tall bar.\r\n */\r\nconst THIN_STRIP_M = 1.0;\r\n\r\n/** Inset (m) applied to flat zone caps so adjacent zones read as separate. */\r\nconst FLAT_ZONE_GAP_M = 0.2;\r\n\r\n/** Ray-cast point-in-ring test. */\r\nfunction pointInRing(x: number, y: number, ring: [number, number][]): boolean {\r\n let inside = false;\r\n const n = ring.length;\r\n for (let i = 0, j = n - 1; i < n; j = i++) {\r\n const a = ring[i];\r\n const b = ring[j];\r\n if (!a || !b) continue;\r\n if (a[1] > y !== b[1] > y && x < ((b[0] - a[0]) * (y - a[1])) / (b[1] - a[1]) + a[0]) {\r\n inside = !inside;\r\n }\r\n }\r\n return inside;\r\n}\r\n\r\n/**\r\n * Inset a ring inward by a constant perpendicular `offset` (metres): each edge\r\n * is shifted inward by `offset` and consecutive shifted edges are intersected.\r\n * This is correct for concave shapes (unlike a vertex-bisector miter, which\r\n * spikes / escapes the polygon at reflex corners). If the result self-intersects\r\n * or leaves the polygon (thin/complex shapes), we fall back to NO inset so the\r\n * top face can never spill outside its footprint.\r\n */\r\nfunction insetRing(ring: [number, number][], offset: number): [number, number][] {\r\n const n = ring.length;\r\n if (n < 3) return ring;\r\n const area = ringArea(ring);\r\n if (Math.abs(area) < 1e-6) return ring;\r\n const s = area > 0 ? 1 : -1; // inward-normal sign for this winding\r\n\r\n // one inward-shifted line per edge: point (px,py) + direction (ux,uy)\r\n const lx: number[] = [];\r\n const ly: number[] = [];\r\n const ux: number[] = [];\r\n const uy: number[] = [];\r\n for (let i = 0; i < n; i++) {\r\n const a = ring[i];\r\n const b = ring[(i + 1) % n];\r\n if (!a || !b) {\r\n lx.push(0);\r\n ly.push(0);\r\n ux.push(1);\r\n uy.push(0);\r\n continue;\r\n }\r\n let ex = b[0] - a[0];\r\n let ey = b[1] - a[1];\r\n const len = Math.hypot(ex, ey) || 1;\r\n ex /= len;\r\n ey /= len;\r\n lx.push(a[0] + -ey * s * offset);\r\n ly.push(a[1] + ex * s * offset);\r\n ux.push(ex);\r\n uy.push(ey);\r\n }\r\n\r\n // new vertex i = intersection of edge-line (i-1) and edge-line (i)\r\n const out: [number, number][] = [];\r\n for (let i = 0; i < n; i++) {\r\n const j = (i - 1 + n) % n;\r\n const uxi = ux[i] ?? 1;\r\n const uyi = uy[i] ?? 0;\r\n const uxj = ux[j] ?? 1;\r\n const uyj = uy[j] ?? 0;\r\n const lxi = lx[i] ?? 0;\r\n const lyi = ly[i] ?? 0;\r\n const lxj = lx[j] ?? 0;\r\n const lyj = ly[j] ?? 0;\r\n const denom = uxj * uyi - uyj * uxi;\r\n if (Math.abs(denom) < 1e-9) {\r\n out.push([lxi, lyi]); // parallel edges — take the shifted start point\r\n continue;\r\n }\r\n const t = ((lxi - lxj) * uyi - (lyi - lyj) * uxi) / denom;\r\n out.push([lxj + t * uxj, lyj + t * uyj]);\r\n }\r\n\r\n // validity: same winding, not collapsed, and every vertex inside the original\r\n const ia = ringArea(out);\r\n if (Math.sign(ia) !== Math.sign(area) || Math.abs(ia) < Math.abs(area) * 0.2) return ring;\r\n for (const p of out) {\r\n if (!pointInRing(p[0], p[1], ring)) return ring;\r\n }\r\n return out;\r\n}\r\n\r\n// Curve smoothing tunables. Kept conservative: aggressive smoothing self-\r\n// intersects on rounded/complex shapes and corrupts the caps. The guard below\r\n// falls back to the original outline whenever a smoothed ring would fold.\r\nconst CURVE_SMOOTH_ITERATIONS = 2;\r\nconst CURVE_KEEP_ANGLE_DEG = 40;\r\n\r\n/** True if any two non-adjacent edges of the ring cross (a folded/bad polygon). */\r\nfunction ringSelfIntersects(ring: [number, number][]): boolean {\r\n const n = ring.length;\r\n const cross = (\r\n a1: [number, number],\r\n a2: [number, number],\r\n b1: [number, number],\r\n b2: [number, number],\r\n ): boolean => {\r\n const d = (a2[0] - a1[0]) * (b2[1] - b1[1]) - (a2[1] - a1[1]) * (b2[0] - b1[0]);\r\n if (Math.abs(d) < 1e-12) return false;\r\n const t = ((b1[0] - a1[0]) * (b2[1] - b1[1]) - (b1[1] - a1[1]) * (b2[0] - b1[0])) / d;\r\n const u = ((b1[0] - a1[0]) * (a2[1] - a1[1]) - (b1[1] - a1[1]) * (a2[0] - a1[0])) / d;\r\n return t > 1e-6 && t < 1 - 1e-6 && u > 1e-6 && u < 1 - 1e-6;\r\n };\r\n for (let i = 0; i < n; i++) {\r\n const a1 = ring[i];\r\n const a2 = ring[(i + 1) % n];\r\n if (!a1 || !a2) continue;\r\n for (let j = i + 2; j < n; j++) {\r\n if (i === 0 && j === n - 1) continue; // skip the wrap-adjacent pair\r\n const b1 = ring[j];\r\n const b2 = ring[(j + 1) % n];\r\n if (!b1 || !b2) continue;\r\n if (cross(a1, a2, b1, b2)) return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Corner-preserving Chaikin smoothing: rounds shallow \"curve\" joints (where the\r\n * outline turns gently, from a faceted arc) while keeping sharp store corners\r\n * intact. Makes curved edges read smooth instead of segmented.\r\n */\r\nfunction smoothRing(\r\n ring: [number, number][],\r\n iterations = CURVE_SMOOTH_ITERATIONS,\r\n keepAngleDeg = CURVE_KEEP_ANGLE_DEG,\r\n): [number, number][] {\r\n const cosKeep = Math.cos((keepAngleDeg * Math.PI) / 180);\r\n let pts = ring;\r\n for (let it = 0; it < iterations; it++) {\r\n const n = pts.length;\r\n if (n < 4) break;\r\n const out: [number, number][] = [];\r\n for (let i = 0; i < n; i++) {\r\n const prev = pts[(i - 1 + n) % n];\r\n const cur = pts[i];\r\n const next = pts[(i + 1) % n];\r\n if (!prev || !cur || !next) {\r\n if (cur) out.push([cur[0], cur[1]]);\r\n continue;\r\n }\r\n const d1x = cur[0] - prev[0];\r\n const d1y = cur[1] - prev[1];\r\n const d2x = next[0] - cur[0];\r\n const d2y = next[1] - cur[1];\r\n const l1 = Math.hypot(d1x, d1y) || 1;\r\n const l2 = Math.hypot(d2x, d2y) || 1;\r\n const dot = (d1x * d2x + d1y * d2y) / (l1 * l2); // cos(turn angle)\r\n if (dot <= cosKeep) {\r\n out.push([cur[0], cur[1]]); // sharp corner — keep\r\n } else {\r\n out.push([cur[0] - 0.25 * d1x, cur[1] - 0.25 * d1y]); // cut the shallow joint\r\n out.push([cur[0] + 0.25 * d2x, cur[1] + 0.25 * d2y]);\r\n }\r\n }\r\n pts = out;\r\n }\r\n // guard: never emit a folded outline — fall back to the original faceted ring\r\n return ringSelfIntersects(pts) ? ring : pts;\r\n}\r\n\r\n/**\r\n * Build one floor's merged geometry, DATA-DRIVEN from the editor's shape\r\n * types and per-shape `shapeProperties` (heights, colors, opacity):\r\n * - base (height ≤ 0.2 or mock `footprint`) → flat cap at slab height + skirt\r\n * - WALL / INNER_WALL → extruded colored walls with top caps (no windows)\r\n * - POLYGON units → matte shaded walls (vertical gradient) + lit roof + label\r\n * Merges to ≤3 draw calls per floor (textured, solid, translucent).\r\n */\r\nexport function buildFloorGeometry(\r\n frame: VenueFrame,\r\n floor: Floor,\r\n theme: PolygonTheme,\r\n): FloorGeometry {\r\n const solid: THREE.BufferGeometry[] = [];\r\n const glass: THREE.BufferGeometry[] = [];\r\n const labelSpecs: LabelSpec[] = [];\r\n // dark outline segments around every polygon roof (separation between\r\n // neighbours) — LineSegments = consecutive vertex pairs. One draw call.\r\n const borderPos: number[] = [];\r\n const pushBorder = (rings: [number, number][][], z: number): void => {\r\n for (const ring of rings) {\r\n for (let i = 0; i < ring.length; i++) {\r\n const a = ring[i];\r\n const b = ring[(i + 1) % ring.length];\r\n if (a && b) borderPos.push(a[0], a[1], z, b[0], b[1], z);\r\n }\r\n }\r\n };\r\n\r\n const locationByShapeId = new Map<string, VenueLocation>();\r\n for (const loc of floor.locations) {\r\n if (loc.shapeId) locationByShapeId.set(loc.shapeId, loc);\r\n }\r\n\r\n for (const shape of floor.shapes) {\r\n const role = shapeRole(shape);\r\n const style = shape.style;\r\n // Editor opacity DISABLED for now (user call): translucent blending over\r\n // overlapping editor polygons produced banding artifacts. Everything goes\r\n // to the opaque bucket. Re-enable per-shape opacity once blending is sorted.\r\n const bucket = solid;\r\n const height = shapeHeight(shape, role);\r\n // Overlapping neighbor polygons share identical editor heights (e.g. 4m)\r\n // → coplanar roofs → z-fighting. A deterministic ≤4.5cm per-shape offset\r\n // keeps every roof on its own plane, imperceptibly.\r\n const antiCoplanar = (hashId(shape.id) % 16) * 0.003;\r\n const z1 = SLAB_HEIGHT + height + antiCoplanar;\r\n\r\n // INNER_WALL: centerline → wall band (v1 buffers ~0.8m each side)\r\n if (role === 'partition') {\r\n const pts =\r\n shape.geometry.type === 'LineString'\r\n ? shape.geometry.coordinates.map((p) => toMeters(frame, p))\r\n : shapeRings(frame, shape)[0];\r\n // panel theme forces a constant reduced wall height + colour; otherwise\r\n // a zero editor height means \"no wall\".\r\n if (!pts || pts.length < 2 || (!theme.panel && height <= 0)) continue;\r\n const P = theme.panel;\r\n const wallZ1 = P ? SLAB_HEIGHT + P.wallHeight : z1;\r\n // INNER_WALL carries only ONE colour in the editor data (`color`, no\r\n // fillColor). A panel theme replaces it with the fixed partition colour\r\n // unless `wallFromData` (data theme) asks for the editor's own value.\r\n const innerHex = P\r\n ? P.wallFromData\r\n ? (style?.color ?? P.innerWall)\r\n : P.innerWall\r\n : (style?.color ?? DEFAULT_WALL_SIDE.getStyle());\r\n bucket.push(\r\n ...lineBandGeometries(pts, false, SLAB_HEIGHT, wallZ1, WALL_BAND_HALF_WIDTH_M, new THREE.Color(innerHex)),\r\n );\r\n continue;\r\n }\r\n\r\n const rings = shapeRings(frame, shape);\r\n const outer = rings[0];\r\n if (!outer) continue;\r\n\r\n if (role === 'base') {\r\n const location0 = locationByShapeId.get(shape.id);\r\n if (shape.layerId === 'footprint') {\r\n // mock slab: cap + skirt\r\n bucket.push(capWithHoles(rings, SLAB_HEIGHT, new THREE.Color(style?.fillColor ?? SLAB_TOP.getStyle())));\r\n bucket.push(coloredSides(rings, 0, SLAB_HEIGHT, new THREE.Color('#f2f2f5')));\r\n } else {\r\n // editor flat zone/carpet: stacked slightly above the floor plate to\r\n // avoid z-fighting (carpets with height 0.1 sit a hair higher)\r\n const z = SLAB_HEIGHT + 0.03 + ((style?.height ?? 0) > 0 ? 0.03 : 0) + (hashId(shape.id) % 8) * 0.002;\r\n // panel theme paints the corridor floor a light neutral so the map stays\r\n // bright — the data theme (`topUpperFromData`) keeps the editor's own\r\n // zone colour exactly as authored.\r\n const baseColor =\r\n theme.panel && !theme.panel.topUpperFromData\r\n ? new THREE.Color(theme.panel.floor)\r\n : polygonTopColor(shape, location0);\r\n // inset the cap slightly so adjacent flat zones get a visible seam of\r\n // the underlying plate between them instead of blending edge-to-edge\r\n // (insetRing falls back to the original ring for slivers it would break)\r\n const insetFlat = rings.map((r) => insetRing(r, FLAT_ZONE_GAP_M));\r\n bucket.push(capWithHoles(insetFlat, z, baseColor));\r\n pushBorder(insetFlat, z + 0.02);\r\n if (location0 && !location0.hidden && !location0.amenity) {\r\n const [cx0, cy0] = polygonCentroid(outer);\r\n const fit0 = labelFit(outer, location0.name, cx0, cy0);\r\n labelSpecs.push({\r\n text: fit0.text,\r\n x: cx0,\r\n y: cy0,\r\n z: z + 0.05,\r\n fontSize: fit0.fontSize,\r\n baseRotation: fit0.rotation,\r\n locationId: location0.id,\r\n ...(location0.logoUrl\r\n ? { logoUrl: location0.logoUrl, ...logoFitBox(outer, cx0, cy0, fit0.rotation, fit0.alongM, fit0.acrossM) }\r\n : {}),\r\n });\r\n }\r\n }\r\n continue;\r\n }\r\n\r\n // WALL carries TWO colours in the editor data — `fillColor` for the flat\r\n // floor plate (the base layer) and `color` for the perimeter wall band. A\r\n // panel theme replaces both with fixed colours (`wallBase` / `wall`).\r\n // NO lid over the interior (that lid was the \"grey plate\" bug).\r\n if (role === 'boundary') {\r\n const P = theme.panel;\r\n // `wallFromData` (data theme) keeps the editor's own two colours, falling\r\n // back to the fixed ones for the floors that omit `fillColor` entirely.\r\n const plateHex = P\r\n ? P.wallFromData\r\n ? (style?.fillColor ?? P.wallBase)\r\n : P.wallBase\r\n : (style?.fillColor ?? '#c9c9c9');\r\n solid.push(capWithHoles(rings, SLAB_HEIGHT, new THREE.Color(plateHex)));\r\n solid.push(coloredSides(rings, 0, SLAB_HEIGHT, new THREE.Color('#f2f2f5')));\r\n // panel theme forces a constant reduced wall height + colour\r\n const wallZ1 = P ? SLAB_HEIGHT + P.wallHeight : z1;\r\n const wallHex = P\r\n ? P.wallFromData\r\n ? (style?.color ?? P.wall)\r\n : P.wall\r\n : (style?.color ?? '#f7f7f7');\r\n bucket.push(\r\n ...lineBandGeometries(outer, true, SLAB_HEIGHT, wallZ1, WALL_BAND_HALF_WIDTH_M, new THREE.Color(wallHex)),\r\n );\r\n continue;\r\n }\r\n\r\n const location = locationByShapeId.get(shape.id);\r\n\r\n // Thin divider/rail strips (mistyped as POLYGON, ~0.5m wide) would extrude\r\n // into tall bars — render them as a low flat strip on the floor instead.\r\n const perim = ringPerimeter(outer);\r\n const thickness = perim > 0 ? (2 * Math.abs(ringArea(outer))) / perim : 0;\r\n if (thickness < THIN_STRIP_M) {\r\n const dz = SLAB_HEIGHT + 0.12;\r\n const dividerCol = new THREE.Color('#adadb6');\r\n bucket.push(gradientSides(rings, SLAB_HEIGHT, dz, dividerCol, dividerCol));\r\n bucket.push(capWithHoles(rings, dz, dividerCol));\r\n continue;\r\n }\r\n\r\n // Panel theme: fixed-colour multi-tier directory panel (base band → constant\r\n // -height wall → lower-layer rim → inset upper face with the label).\r\n if (theme.panel) {\r\n const P = theme.panel;\r\n // glass theme → translucent bucket; the top face can take the store's own\r\n // editor/category colour (data theme) instead of the fixed panel colour.\r\n const panelBucket = theme.translucent ? glass : bucket;\r\n // uniformHeight (Visioglobe policy) flattens every unit to one calm\r\n // roofline; otherwise the store keeps its data height. Top section =\r\n // topFraction of the height, the base/wall gets the rest.\r\n const hEff = P.uniformHeight ?? height;\r\n const topZ = SLAB_HEIGHT + hEff + antiCoplanar;\r\n const wallTopZ = topZ - hEff * P.topFraction; // rim level\r\n const upperCol = P.topUpperFromData\r\n ? polygonTopColor(shape, location) // the EXACT editor colour, untouched\r\n : new THREE.Color(P.topUpper);\r\n // Data theme: ONLY the raised top layer — its face and its side walls —\r\n // takes the store's data colour. The rim ledge, the tall sides, and the\r\n // base band all stay theme-neutral.\r\n const baseCol = new THREE.Color(P.base);\r\n const edgeCol = new THREE.Color(P.edge);\r\n const lowerCol = new THREE.Color(P.topLower);\r\n // soft contact tone spreading past the footprint so the slab sits on the\r\n // floor instead of floating\r\n panelBucket.push(\r\n capWithHoles(\r\n rings.map((r) => insetRing(r, -CONTACT_SHADOW_SPREAD_M)),\r\n SLAB_HEIGHT + 0.015,\r\n CONTACT_SHADOW,\r\n ),\r\n );\r\n // No hard seam between the base layer and the side above it — but the\r\n // fade stays SHORT: only the bottom stretch blends base → edge, and the\r\n // side is solid edge colour above that, so it still reads bright.\r\n const blendTop = SLAB_HEIGHT + Math.min(0.6, Math.max(0.2, (wallTopZ - SLAB_HEIGHT) * 0.3));\r\n panelBucket.push(gradientSides(rings, SLAB_HEIGHT, blendTop, edgeCol, baseCol)); // short fade\r\n panelBucket.push(gradientSides(rings, blendTop, wallTopZ, edgeCol, edgeCol)); // solid above\r\n panelBucket.push(capWithHoles(rings, wallTopZ, lowerCol)); // top lower layer / rim\r\n const insetR = rings.map((r) => insetRing(r, P.rimWidth));\r\n // The raised top's little side walls take the bevel colour (own slot, so\r\n // the tall lower side can differ) — that bright ring around a darker top\r\n // face is the signature of the reference maps; matching sides erase it.\r\n const bevelCol = P.topUpperFromData ? upperCol : new THREE.Color(P.bevel ?? P.edge);\r\n panelBucket.push(gradientSides(insetR, wallTopZ, topZ, bevelCol, bevelCol)); // bevel\r\n panelBucket.push(capWithHoles(insetR, topZ, upperCol)); // inset top upper face\r\n pushBorder(rings, wallTopZ + 0.02); // panel outline (separates neighbours)\r\n if (location && !location.hidden && !location.amenity) {\r\n const [cx, cy] = polygonCentroid(outer);\r\n const fit = labelFit(outer, location.name, cx, cy);\r\n labelSpecs.push({\r\n text: fit.text,\r\n x: cx,\r\n y: cy,\r\n z: topZ + 0.05,\r\n fontSize: fit.fontSize,\r\n baseRotation: fit.rotation,\r\n locationId: location.id,\r\n ...(location.logoUrl\r\n ? { logoUrl: location.logoUrl, ...logoFitBox(outer, cx, cy, fit.rotation, fit.alongM, fit.acrossM) }\r\n : {}),\r\n });\r\n }\r\n continue;\r\n }\r\n\r\n // unit: themed block — roof + vertical-gradient walls. Glass themes render\r\n // translucent (their own bucket/material); everything else is opaque.\r\n const base = polygonTopColor(shape, location);\r\n const unitBucket = theme.translucent ? glass : bucket;\r\n unitBucket.push(gradientSides(rings, SLAB_HEIGHT, z1, theme.wallTop(base), theme.wallBase(base)));\r\n unitBucket.push(capWithHoles(rings, z1, theme.roof(base)));\r\n pushBorder(rings, z1 + 0.02);\r\n\r\n if (location && !location.hidden && !location.amenity) {\r\n const [cx, cy] = polygonCentroid(outer);\r\n const fit = labelFit(outer, location.name, cx, cy);\r\n labelSpecs.push({\r\n text: fit.text,\r\n x: cx,\r\n y: cy,\r\n z: z1 + 0.08,\r\n fontSize: fit.fontSize,\r\n baseRotation: fit.rotation,\r\n locationId: location.id,\r\n ...(location.logoUrl\r\n ? { logoUrl: location.logoUrl, ...logoFitBox(outer, cx, cy, fit.rotation, fit.alongM, fit.acrossM) }\r\n : {}),\r\n });\r\n }\r\n }\r\n\r\n let borders: THREE.BufferGeometry | null = null;\r\n if (borderPos.length) {\r\n borders = new THREE.BufferGeometry();\r\n borders.setAttribute('position', new THREE.BufferAttribute(new Float32Array(borderPos), 3));\r\n }\r\n\r\n return {\r\n solid: solid.length ? mergeGeometries(solid, false) : null,\r\n translucent: glass.length ? mergeGeometries(glass, false) : null,\r\n borders,\r\n labelSpecs,\r\n };\r\n}\r\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * @param {Array<BufferGeometry>} geometries\n * @param {Boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {BufferAttribute}\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.count * itemSize;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst tupleOffset = offset / itemSize;\n\t\t\tfor ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tconst value = attribute.getComponent( j, c );\n\t\t\t\t\tresult.setComponent( j + tupleOffset, c, value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tarray.set( attribute.array, offset );\n\n\t\t}\n\n\t\toffset += attribute.count * itemSize;\n\n\t}\n\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferAttribute} attribute\n * @return {BufferAttribute}\n */\nexport function deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {Array<InterleavedBufferAttribute>}\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n// returns a new, non-interleaved version of the provided attribute\nexport function deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n// deinterleaves all attributes on the geometry\nexport function deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @return {number}\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry}\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new attr.constructor(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\tif ( morphAttributes ) {\n\n\t\t\tif ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];\n\t\t\tmorphAttributes.forEach( ( morphAttr, i ) => {\n\n\t\t\t\tconst array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );\n\t\t\t\ttmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newArray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttributes ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new tmpAttribute.constructor(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new tmpMorphAttribute.constructor(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry}\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry\n * @param {number} [creaseAngle]\n * @return {BufferGeometry}\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeAttributes,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import * as THREE from 'three';\r\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n// @ts-ignore troika-three-text ships no types\r\nimport { BatchedText, Text } from 'troika-three-text';\r\nimport type { LabelSpec } from './geometry.js';\r\n\r\n/**\r\n * Floor labels via troika BatchedText: one draw call per floor batch.\r\n * Labels are part of the MAP: aligned to their own store's axes and fixed to\r\n * the venue, rotating with it. `setFlip` turns all of them 180 degrees once\r\n * the bearing passes +-90 so text never reads upside-down (hysteresis in caller).\r\n */\r\nexport interface FloorLabels {\r\n object: THREE.Object3D;\r\n /** Flip all labels 180 degrees (true) or back upright (false). */\r\n setFlip(flipped: boolean): void;\r\n dispose(): void;\r\n}\r\n\r\ninterface TroikaText extends THREE.Object3D {\r\n text: string;\r\n fontSize: number;\r\n color: number;\r\n anchorX: string;\r\n anchorY: string;\r\n outlineWidth: string | number;\r\n outlineColor: number;\r\n outlineBlur: string | number;\r\n fontWeight: string | number;\r\n textAlign: string;\r\n sync(cb?: () => void): void;\r\n dispose(): void;\r\n}\r\n\r\n/** Flat ink, no halo — clean text sitting directly on the panel top. The\r\n * colour comes from the theme (black on light tops, white on data colours). */\r\nfunction styleLabel(t: TroikaText, color: number): void {\r\n t.color = color;\r\n t.fontWeight = 'bold';\r\n t.outlineWidth = 0; // no halo\r\n t.anchorX = 'center';\r\n t.anchorY = 'middle';\r\n t.textAlign = 'center'; // wrapped two-line names centre on each other\r\n}\r\n\r\n/** A single standalone label (building names on sealed shells). */\r\nexport interface SingleLabel {\r\n object: THREE.Object3D;\r\n setFlip(flipped: boolean): void;\r\n dispose(): void;\r\n}\r\n\r\nexport function createSingleLabel(\r\n spec: { text: string; x: number; y: number; z: number; fontSize: number; baseRotation?: number; color?: number },\r\n onReady?: () => void,\r\n): SingleLabel {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment\r\n const t = new Text() as TroikaText;\r\n t.text = spec.text;\r\n t.fontSize = spec.fontSize;\r\n styleLabel(t, spec.color ?? 0x000000);\r\n t.position.set(spec.x, spec.y, spec.z);\r\n const base = spec.baseRotation ?? 0;\r\n t.rotation.z = base;\r\n t.sync(onReady);\r\n return {\r\n object: t,\r\n // world-fixed: keep the polygon-aligned base yaw, add 180 only when flipping.\r\n setFlip(flipped: boolean): void {\r\n t.rotation.z = base + (flipped ? Math.PI : 0);\r\n },\r\n dispose(): void {\r\n t.dispose();\r\n },\r\n };\r\n}\r\n\r\n// A location with a logo shows ONLY the logo — the name renders otherwise.\r\n// The box a logo may fill is computed by the geometry layer (row-sampled so\r\n// the logo stays inside even concave stores); this module just fits into it.\r\n\r\ninterface LogoEntry {\r\n mesh: THREE.Mesh;\r\n x: number;\r\n y: number;\r\n z: number;\r\n base: number;\r\n off: number;\r\n}\r\n\r\n/** Position a logo above its label along the label's own \"up\", honouring flip. */\r\nfunction placeLogo(e: LogoEntry, extra: number): void {\r\n const rot = e.base + extra;\r\n const ux = -Math.sin(rot);\r\n const uy = Math.cos(rot);\r\n e.mesh.position.set(e.x + ux * e.off, e.y + uy * e.off, e.z);\r\n e.mesh.rotation.z = rot;\r\n}\r\n\r\nexport function createFloorLabels(specs: LabelSpec[], color: number, onReady?: () => void): FloorLabels {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment\r\n const batched = new BatchedText() as TroikaText & { addText?: unknown };\r\n const members: { text: TroikaText; base: number }[] = [];\r\n for (const spec of specs) {\r\n if (spec.logoUrl) continue; // the logo replaces the name entirely\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment\r\n const t = new Text() as TroikaText;\r\n t.text = spec.text;\r\n t.fontSize = spec.fontSize;\r\n styleLabel(t, color);\r\n t.position.set(spec.x, spec.y, spec.z);\r\n t.rotation.z = spec.baseRotation; // align to the polygon's dominant edge\r\n (batched as unknown as THREE.Object3D).add(t);\r\n members.push({ text: t, base: spec.baseRotation });\r\n }\r\n batched.sync(onReady);\r\n\r\n // Brand logos from the venue data, drawn IN PLACE of the name: a location\r\n // with a logo gets only its logo, sized from the same polygon-driven fit.\r\n // Loaded lazily; a failed load (missing file / CORS) leaves the store bare.\r\n const group = new THREE.Group();\r\n group.add(batched);\r\n const logos: LogoEntry[] = [];\r\n const loader = new THREE.TextureLoader();\r\n loader.setCrossOrigin('anonymous');\r\n for (const spec of specs) {\r\n if (!spec.logoUrl) continue;\r\n // the box the geometry layer measured INSIDE the polygon for this logo\r\n const availW = spec.logoBoxW ?? 5 * spec.fontSize;\r\n const availH = spec.logoBoxH ?? 1.5 * spec.fontSize;\r\n const off = 0; // centred exactly where the name would have been\r\n const mat = new THREE.MeshBasicMaterial({ transparent: true, opacity: 0, depthWrite: false });\r\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\r\n const entry: LogoEntry = { mesh, x: spec.x, y: spec.y, z: spec.z + 0.03, base: spec.baseRotation, off };\r\n placeLogo(entry, 0);\r\n loader.load(\r\n spec.logoUrl,\r\n (tex) => {\r\n tex.colorSpace = THREE.SRGBColorSpace;\r\n const img = tex.image as { width?: number; height?: number };\r\n const aspect = Math.max(0.05, (img.width ?? 1) / Math.max(1, img.height ?? 1));\r\n // largest size that fits the store's box at the logo's own aspect\r\n const h = Math.min(availH, availW / aspect);\r\n mesh.scale.set(h * aspect, h, 1);\r\n mat.map = tex;\r\n mat.opacity = 1;\r\n mat.needsUpdate = true;\r\n onReady?.();\r\n },\r\n undefined,\r\n () => undefined, // logo unavailable → store stays bare, silently\r\n );\r\n group.add(mesh);\r\n logos.push(entry);\r\n }\r\n\r\n return {\r\n object: group,\r\n // each label keeps its own polygon-aligned base yaw; flip adds 180 on top,\r\n // and logos flip in place so they stay upright on screen.\r\n setFlip(flipped: boolean): void {\r\n const extra = flipped ? Math.PI : 0;\r\n for (const { text, base } of members) text.rotation.z = base + extra;\r\n for (const e of logos) placeLogo(e, extra);\r\n },\r\n dispose(): void {\r\n batched.dispose();\r\n for (const { mesh } of logos) {\r\n mesh.geometry.dispose();\r\n const m = mesh.material as THREE.MeshBasicMaterial;\r\n m.map?.dispose();\r\n m.dispose();\r\n }\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Bearing→flip policy with hysteresis (flip past 95°, unflip under 85°) —\r\n * pure so it's unit-testable.\r\n */\r\nexport function labelFlipState(bearingDeg: number, currentlyFlipped: boolean): boolean {\r\n let b = bearingDeg % 360;\r\n if (b > 180) b -= 360;\r\n if (b <= -180) b += 360;\r\n return currentlyFlipped ? Math.abs(b) > 85 : Math.abs(b) > 95;\r\n}\r\n","import { Texture, LinearFilter, Color, InstancedBufferGeometry, Sphere, Box3, InstancedBufferAttribute, PlaneGeometry, Vector2, Vector4, Matrix3, Mesh, MeshBasicMaterial, DoubleSide, Matrix4, Vector3, DataTexture, RGBAFormat, FloatType, DynamicDrawUsage } from 'three';\nimport { defineWorkerModule, terminateWorker } from 'troika-worker-utils';\nimport createSDFGenerator from 'webgl-sdf-generator';\nimport bidiFactory from 'bidi-js';\nimport { createDerivedMaterial, voidMainRegExp } from 'troika-three-utils';\n\n/*!\nCustom build of Typr.ts (https://github.com/fredli74/Typr.ts) for use in Troika text rendering.\nOriginal MIT license applies: https://github.com/fredli74/Typr.ts/blob/master/LICENSE\n*/\nfunction typrFactory(){return \"undefined\"==typeof window&&(self.window=self),function(r){var e={parse:function(r){var t=e._bin,a=new Uint8Array(r);if(\"ttcf\"==t.readASCII(a,0,4)){var n=4;t.readUshort(a,n),n+=2,t.readUshort(a,n),n+=2;var o=t.readUint(a,n);n+=4;for(var s=[],i=0;i<o;i++){var h=t.readUint(a,n);n+=4,s.push(e._readFont(a,h));}return s}return [e._readFont(a,0)]},_readFont:function(r,t){var a=e._bin,n=t;a.readFixed(r,t),t+=4;var o=a.readUshort(r,t);t+=2,a.readUshort(r,t),t+=2,a.readUshort(r,t),t+=2,a.readUshort(r,t),t+=2;for(var s=[\"cmap\",\"head\",\"hhea\",\"maxp\",\"hmtx\",\"name\",\"OS/2\",\"post\",\"loca\",\"glyf\",\"kern\",\"CFF \",\"GDEF\",\"GPOS\",\"GSUB\",\"SVG \"],i={_data:r,_offset:n},h={},d=0;d<o;d++){var f=a.readASCII(r,t,4);t+=4,a.readUint(r,t),t+=4;var u=a.readUint(r,t);t+=4;var l=a.readUint(r,t);t+=4,h[f]={offset:u,length:l};}for(d=0;d<s.length;d++){var v=s[d];h[v]&&(i[v.trim()]=e[v.trim()].parse(r,h[v].offset,h[v].length,i));}return i},_tabOffset:function(r,t,a){for(var n=e._bin,o=n.readUshort(r,a+4),s=a+12,i=0;i<o;i++){var h=n.readASCII(r,s,4);s+=4,n.readUint(r,s),s+=4;var d=n.readUint(r,s);if(s+=4,n.readUint(r,s),s+=4,h==t)return d}return 0}};e._bin={readFixed:function(r,e){return (r[e]<<8|r[e+1])+(r[e+2]<<8|r[e+3])/65540},readF2dot14:function(r,t){return e._bin.readShort(r,t)/16384},readInt:function(r,t){return e._bin._view(r).getInt32(t)},readInt8:function(r,t){return e._bin._view(r).getInt8(t)},readShort:function(r,t){return e._bin._view(r).getInt16(t)},readUshort:function(r,t){return e._bin._view(r).getUint16(t)},readUshorts:function(r,t,a){for(var n=[],o=0;o<a;o++)n.push(e._bin.readUshort(r,t+2*o));return n},readUint:function(r,t){return e._bin._view(r).getUint32(t)},readUint64:function(r,t){return 4294967296*e._bin.readUint(r,t)+e._bin.readUint(r,t+4)},readASCII:function(r,e,t){for(var a=\"\",n=0;n<t;n++)a+=String.fromCharCode(r[e+n]);return a},readUnicode:function(r,e,t){for(var a=\"\",n=0;n<t;n++){var o=r[e++]<<8|r[e++];a+=String.fromCharCode(o);}return a},_tdec:\"undefined\"!=typeof window&&window.TextDecoder?new window.TextDecoder:null,readUTF8:function(r,t,a){var n=e._bin._tdec;return n&&0==t&&a==r.length?n.decode(r):e._bin.readASCII(r,t,a)},readBytes:function(r,e,t){for(var a=[],n=0;n<t;n++)a.push(r[e+n]);return a},readASCIIArray:function(r,e,t){for(var a=[],n=0;n<t;n++)a.push(String.fromCharCode(r[e+n]));return a},_view:function(r){return r._dataView||(r._dataView=r.buffer?new DataView(r.buffer,r.byteOffset,r.byteLength):new DataView(new Uint8Array(r).buffer))}},e._lctf={},e._lctf.parse=function(r,t,a,n,o){var s=e._bin,i={},h=t;s.readFixed(r,t),t+=4;var d=s.readUshort(r,t);t+=2;var f=s.readUshort(r,t);t+=2;var u=s.readUshort(r,t);return t+=2,i.scriptList=e._lctf.readScriptList(r,h+d),i.featureList=e._lctf.readFeatureList(r,h+f),i.lookupList=e._lctf.readLookupList(r,h+u,o),i},e._lctf.readLookupList=function(r,t,a){var n=e._bin,o=t,s=[],i=n.readUshort(r,t);t+=2;for(var h=0;h<i;h++){var d=n.readUshort(r,t);t+=2;var f=e._lctf.readLookupTable(r,o+d,a);s.push(f);}return s},e._lctf.readLookupTable=function(r,t,a){var n=e._bin,o=t,s={tabs:[]};s.ltype=n.readUshort(r,t),t+=2,s.flag=n.readUshort(r,t),t+=2;var i=n.readUshort(r,t);t+=2;for(var h=s.ltype,d=0;d<i;d++){var f=n.readUshort(r,t);t+=2;var u=a(r,h,o+f,s);s.tabs.push(u);}return s},e._lctf.numOfOnes=function(r){for(var e=0,t=0;t<32;t++)0!=(r>>>t&1)&&e++;return e},e._lctf.readClassDef=function(r,t){var a=e._bin,n=[],o=a.readUshort(r,t);if(t+=2,1==o){var s=a.readUshort(r,t);t+=2;var i=a.readUshort(r,t);t+=2;for(var h=0;h<i;h++)n.push(s+h),n.push(s+h),n.push(a.readUshort(r,t)),t+=2;}if(2==o){var d=a.readUshort(r,t);t+=2;for(h=0;h<d;h++)n.push(a.readUshort(r,t)),t+=2,n.push(a.readUshort(r,t)),t+=2,n.push(a.readUshort(r,t)),t+=2;}return n},e._lctf.getInterval=function(r,e){for(var t=0;t<r.length;t+=3){var a=r[t],n=r[t+1];if(r[t+2],a<=e&&e<=n)return t}return -1},e._lctf.readCoverage=function(r,t){var a=e._bin,n={};n.fmt=a.readUshort(r,t),t+=2;var o=a.readUshort(r,t);return t+=2,1==n.fmt&&(n.tab=a.readUshorts(r,t,o)),2==n.fmt&&(n.tab=a.readUshorts(r,t,3*o)),n},e._lctf.coverageIndex=function(r,t){var a=r.tab;if(1==r.fmt)return a.indexOf(t);if(2==r.fmt){var n=e._lctf.getInterval(a,t);if(-1!=n)return a[n+2]+(t-a[n])}return -1},e._lctf.readFeatureList=function(r,t){var a=e._bin,n=t,o=[],s=a.readUshort(r,t);t+=2;for(var i=0;i<s;i++){var h=a.readASCII(r,t,4);t+=4;var d=a.readUshort(r,t);t+=2;var f=e._lctf.readFeatureTable(r,n+d);f.tag=h.trim(),o.push(f);}return o},e._lctf.readFeatureTable=function(r,t){var a=e._bin,n=t,o={},s=a.readUshort(r,t);t+=2,s>0&&(o.featureParams=n+s);var i=a.readUshort(r,t);t+=2,o.tab=[];for(var h=0;h<i;h++)o.tab.push(a.readUshort(r,t+2*h));return o},e._lctf.readScriptList=function(r,t){var a=e._bin,n=t,o={},s=a.readUshort(r,t);t+=2;for(var i=0;i<s;i++){var h=a.readASCII(r,t,4);t+=4;var d=a.readUshort(r,t);t+=2,o[h.trim()]=e._lctf.readScriptTable(r,n+d);}return o},e._lctf.readScriptTable=function(r,t){var a=e._bin,n=t,o={},s=a.readUshort(r,t);t+=2,s>0&&(o.default=e._lctf.readLangSysTable(r,n+s));var i=a.readUshort(r,t);t+=2;for(var h=0;h<i;h++){var d=a.readASCII(r,t,4);t+=4;var f=a.readUshort(r,t);t+=2,o[d.trim()]=e._lctf.readLangSysTable(r,n+f);}return o},e._lctf.readLangSysTable=function(r,t){var a=e._bin,n={};a.readUshort(r,t),t+=2,n.reqFeature=a.readUshort(r,t),t+=2;var o=a.readUshort(r,t);return t+=2,n.features=a.readUshorts(r,t,o),n},e.CFF={},e.CFF.parse=function(r,t,a){var n=e._bin;(r=new Uint8Array(r.buffer,t,a))[t=0],r[++t],r[++t],r[++t],t++;var o=[];t=e.CFF.readIndex(r,t,o);for(var s=[],i=0;i<o.length-1;i++)s.push(n.readASCII(r,t+o[i],o[i+1]-o[i]));t+=o[o.length-1];var h=[];t=e.CFF.readIndex(r,t,h);var d=[];for(i=0;i<h.length-1;i++)d.push(e.CFF.readDict(r,t+h[i],t+h[i+1]));t+=h[h.length-1];var f=d[0],u=[];t=e.CFF.readIndex(r,t,u);var l=[];for(i=0;i<u.length-1;i++)l.push(n.readASCII(r,t+u[i],u[i+1]-u[i]));if(t+=u[u.length-1],e.CFF.readSubrs(r,t,f),f.CharStrings){t=f.CharStrings;u=[];t=e.CFF.readIndex(r,t,u);var v=[];for(i=0;i<u.length-1;i++)v.push(n.readBytes(r,t+u[i],u[i+1]-u[i]));f.CharStrings=v;}if(f.ROS){t=f.FDArray;var c=[];t=e.CFF.readIndex(r,t,c),f.FDArray=[];for(i=0;i<c.length-1;i++){var p=e.CFF.readDict(r,t+c[i],t+c[i+1]);e.CFF._readFDict(r,p,l),f.FDArray.push(p);}t+=c[c.length-1],t=f.FDSelect,f.FDSelect=[];var U=r[t];if(t++,3!=U)throw U;var g=n.readUshort(r,t);t+=2;for(i=0;i<g+1;i++)f.FDSelect.push(n.readUshort(r,t),r[t+2]),t+=3;}return f.Encoding&&(f.Encoding=e.CFF.readEncoding(r,f.Encoding,f.CharStrings.length)),f.charset&&(f.charset=e.CFF.readCharset(r,f.charset,f.CharStrings.length)),e.CFF._readFDict(r,f,l),f},e.CFF._readFDict=function(r,t,a){var n;for(var o in t.Private&&(n=t.Private[1],t.Private=e.CFF.readDict(r,n,n+t.Private[0]),t.Private.Subrs&&e.CFF.readSubrs(r,n+t.Private.Subrs,t.Private)),t)-1!=[\"FamilyName\",\"FontName\",\"FullName\",\"Notice\",\"version\",\"Copyright\"].indexOf(o)&&(t[o]=a[t[o]-426+35]);},e.CFF.readSubrs=function(r,t,a){var n=e._bin,o=[];t=e.CFF.readIndex(r,t,o);var s,i=o.length;s=i<1240?107:i<33900?1131:32768,a.Bias=s,a.Subrs=[];for(var h=0;h<o.length-1;h++)a.Subrs.push(n.readBytes(r,t+o[h],o[h+1]-o[h]));},e.CFF.tableSE=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,0,111,112,113,114,0,115,116,117,118,119,120,121,122,0,123,0,124,125,126,127,128,129,130,131,0,132,133,0,134,135,136,137,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,0,139,0,0,0,0,140,141,142,143,0,0,0,0,0,144,0,0,0,145,0,0,146,147,148,149,0,0,0,0],e.CFF.glyphByUnicode=function(r,e){for(var t=0;t<r.charset.length;t++)if(r.charset[t]==e)return t;return -1},e.CFF.glyphBySE=function(r,t){return t<0||t>255?-1:e.CFF.glyphByUnicode(r,e.CFF.tableSE[t])},e.CFF.readEncoding=function(r,t,a){e._bin;var n=[\".notdef\"],o=r[t];if(t++,0!=o)throw \"error: unknown encoding format: \"+o;var s=r[t];t++;for(var i=0;i<s;i++)n.push(r[t+i]);return n},e.CFF.readCharset=function(r,t,a){var n=e._bin,o=[\".notdef\"],s=r[t];if(t++,0==s)for(var i=0;i<a;i++){var h=n.readUshort(r,t);t+=2,o.push(h);}else {if(1!=s&&2!=s)throw \"error: format: \"+s;for(;o.length<a;){h=n.readUshort(r,t);t+=2;var d=0;1==s?(d=r[t],t++):(d=n.readUshort(r,t),t+=2);for(i=0;i<=d;i++)o.push(h),h++;}}return o},e.CFF.readIndex=function(r,t,a){var n=e._bin,o=n.readUshort(r,t)+1,s=r[t+=2];if(t++,1==s)for(var i=0;i<o;i++)a.push(r[t+i]);else if(2==s)for(i=0;i<o;i++)a.push(n.readUshort(r,t+2*i));else if(3==s)for(i=0;i<o;i++)a.push(16777215&n.readUint(r,t+3*i-1));else if(1!=o)throw \"unsupported offset size: \"+s+\", count: \"+o;return (t+=o*s)-1},e.CFF.getCharString=function(r,t,a){var n=e._bin,o=r[t],s=r[t+1];r[t+2],r[t+3],r[t+4];var i=1,h=null,d=null;o<=20&&(h=o,i=1),12==o&&(h=100*o+s,i=2),21<=o&&o<=27&&(h=o,i=1),28==o&&(d=n.readShort(r,t+1),i=3),29<=o&&o<=31&&(h=o,i=1),32<=o&&o<=246&&(d=o-139,i=1),247<=o&&o<=250&&(d=256*(o-247)+s+108,i=2),251<=o&&o<=254&&(d=256*-(o-251)-s-108,i=2),255==o&&(d=n.readInt(r,t+1)/65535,i=5),a.val=null!=d?d:\"o\"+h,a.size=i;},e.CFF.readCharString=function(r,t,a){for(var n=t+a,o=e._bin,s=[];t<n;){var i=r[t],h=r[t+1];r[t+2],r[t+3],r[t+4];var d=1,f=null,u=null;i<=20&&(f=i,d=1),12==i&&(f=100*i+h,d=2),19!=i&&20!=i||(f=i,d=2),21<=i&&i<=27&&(f=i,d=1),28==i&&(u=o.readShort(r,t+1),d=3),29<=i&&i<=31&&(f=i,d=1),32<=i&&i<=246&&(u=i-139,d=1),247<=i&&i<=250&&(u=256*(i-247)+h+108,d=2),251<=i&&i<=254&&(u=256*-(i-251)-h-108,d=2),255==i&&(u=o.readInt(r,t+1)/65535,d=5),s.push(null!=u?u:\"o\"+f),t+=d;}return s},e.CFF.readDict=function(r,t,a){for(var n=e._bin,o={},s=[];t<a;){var i=r[t],h=r[t+1];r[t+2],r[t+3],r[t+4];var d=1,f=null,u=null;if(28==i&&(u=n.readShort(r,t+1),d=3),29==i&&(u=n.readInt(r,t+1),d=5),32<=i&&i<=246&&(u=i-139,d=1),247<=i&&i<=250&&(u=256*(i-247)+h+108,d=2),251<=i&&i<=254&&(u=256*-(i-251)-h-108,d=2),255==i)throw u=n.readInt(r,t+1)/65535,d=5,\"unknown number\";if(30==i){var l=[];for(d=1;;){var v=r[t+d];d++;var c=v>>4,p=15&v;if(15!=c&&l.push(c),15!=p&&l.push(p),15==p)break}for(var U=\"\",g=[0,1,2,3,4,5,6,7,8,9,\".\",\"e\",\"e-\",\"reserved\",\"-\",\"endOfNumber\"],S=0;S<l.length;S++)U+=g[l[S]];u=parseFloat(U);}if(i<=21)if(f=[\"version\",\"Notice\",\"FullName\",\"FamilyName\",\"Weight\",\"FontBBox\",\"BlueValues\",\"OtherBlues\",\"FamilyBlues\",\"FamilyOtherBlues\",\"StdHW\",\"StdVW\",\"escape\",\"UniqueID\",\"XUID\",\"charset\",\"Encoding\",\"CharStrings\",\"Private\",\"Subrs\",\"defaultWidthX\",\"nominalWidthX\"][i],d=1,12==i)f=[\"Copyright\",\"isFixedPitch\",\"ItalicAngle\",\"UnderlinePosition\",\"UnderlineThickness\",\"PaintType\",\"CharstringType\",\"FontMatrix\",\"StrokeWidth\",\"BlueScale\",\"BlueShift\",\"BlueFuzz\",\"StemSnapH\",\"StemSnapV\",\"ForceBold\",0,0,\"LanguageGroup\",\"ExpansionFactor\",\"initialRandomSeed\",\"SyntheticBase\",\"PostScript\",\"BaseFontName\",\"BaseFontBlend\",0,0,0,0,0,0,\"ROS\",\"CIDFontVersion\",\"CIDFontRevision\",\"CIDFontType\",\"CIDCount\",\"UIDBase\",\"FDArray\",\"FDSelect\",\"FontName\"][h],d=2;null!=f?(o[f]=1==s.length?s[0]:s,s=[]):s.push(u),t+=d;}return o},e.cmap={},e.cmap.parse=function(r,t,a){r=new Uint8Array(r.buffer,t,a),t=0;var n=e._bin,o={};n.readUshort(r,t),t+=2;var s=n.readUshort(r,t);t+=2;var i=[];o.tables=[];for(var h=0;h<s;h++){var d=n.readUshort(r,t);t+=2;var f=n.readUshort(r,t);t+=2;var u=n.readUint(r,t);t+=4;var l=\"p\"+d+\"e\"+f,v=i.indexOf(u);if(-1==v){var c;v=o.tables.length,i.push(u);var p=n.readUshort(r,u);0==p?c=e.cmap.parse0(r,u):4==p?c=e.cmap.parse4(r,u):6==p?c=e.cmap.parse6(r,u):12==p?c=e.cmap.parse12(r,u):console.debug(\"unknown format: \"+p,d,f,u),o.tables.push(c);}if(null!=o[l])throw \"multiple tables for one platform+encoding\";o[l]=v;}return o},e.cmap.parse0=function(r,t){var a=e._bin,n={};n.format=a.readUshort(r,t),t+=2;var o=a.readUshort(r,t);t+=2,a.readUshort(r,t),t+=2,n.map=[];for(var s=0;s<o-6;s++)n.map.push(r[t+s]);return n},e.cmap.parse4=function(r,t){var a=e._bin,n=t,o={};o.format=a.readUshort(r,t),t+=2;var s=a.readUshort(r,t);t+=2,a.readUshort(r,t),t+=2;var i=a.readUshort(r,t);t+=2;var h=i/2;o.searchRange=a.readUshort(r,t),t+=2,o.entrySelector=a.readUshort(r,t),t+=2,o.rangeShift=a.readUshort(r,t),t+=2,o.endCount=a.readUshorts(r,t,h),t+=2*h,t+=2,o.startCount=a.readUshorts(r,t,h),t+=2*h,o.idDelta=[];for(var d=0;d<h;d++)o.idDelta.push(a.readShort(r,t)),t+=2;for(o.idRangeOffset=a.readUshorts(r,t,h),t+=2*h,o.glyphIdArray=[];t<n+s;)o.glyphIdArray.push(a.readUshort(r,t)),t+=2;return o},e.cmap.parse6=function(r,t){var a=e._bin,n={};n.format=a.readUshort(r,t),t+=2,a.readUshort(r,t),t+=2,a.readUshort(r,t),t+=2,n.firstCode=a.readUshort(r,t),t+=2;var o=a.readUshort(r,t);t+=2,n.glyphIdArray=[];for(var s=0;s<o;s++)n.glyphIdArray.push(a.readUshort(r,t)),t+=2;return n},e.cmap.parse12=function(r,t){var a=e._bin,n={};n.format=a.readUshort(r,t),t+=2,t+=2,a.readUint(r,t),t+=4,a.readUint(r,t),t+=4;var o=a.readUint(r,t);t+=4,n.groups=[];for(var s=0;s<o;s++){var i=t+12*s,h=a.readUint(r,i+0),d=a.readUint(r,i+4),f=a.readUint(r,i+8);n.groups.push([h,d,f]);}return n},e.glyf={},e.glyf.parse=function(r,e,t,a){for(var n=[],o=0;o<a.maxp.numGlyphs;o++)n.push(null);return n},e.glyf._parseGlyf=function(r,t){var a=e._bin,n=r._data,o=e._tabOffset(n,\"glyf\",r._offset)+r.loca[t];if(r.loca[t]==r.loca[t+1])return null;var s={};if(s.noc=a.readShort(n,o),o+=2,s.xMin=a.readShort(n,o),o+=2,s.yMin=a.readShort(n,o),o+=2,s.xMax=a.readShort(n,o),o+=2,s.yMax=a.readShort(n,o),o+=2,s.xMin>=s.xMax||s.yMin>=s.yMax)return null;if(s.noc>0){s.endPts=[];for(var i=0;i<s.noc;i++)s.endPts.push(a.readUshort(n,o)),o+=2;var h=a.readUshort(n,o);if(o+=2,n.length-o<h)return null;s.instructions=a.readBytes(n,o,h),o+=h;var d=s.endPts[s.noc-1]+1;s.flags=[];for(i=0;i<d;i++){var f=n[o];if(o++,s.flags.push(f),0!=(8&f)){var u=n[o];o++;for(var l=0;l<u;l++)s.flags.push(f),i++;}}s.xs=[];for(i=0;i<d;i++){var v=0!=(2&s.flags[i]),c=0!=(16&s.flags[i]);v?(s.xs.push(c?n[o]:-n[o]),o++):c?s.xs.push(0):(s.xs.push(a.readShort(n,o)),o+=2);}s.ys=[];for(i=0;i<d;i++){v=0!=(4&s.flags[i]),c=0!=(32&s.flags[i]);v?(s.ys.push(c?n[o]:-n[o]),o++):c?s.ys.push(0):(s.ys.push(a.readShort(n,o)),o+=2);}var p=0,U=0;for(i=0;i<d;i++)p+=s.xs[i],U+=s.ys[i],s.xs[i]=p,s.ys[i]=U;}else {var g;s.parts=[];do{g=a.readUshort(n,o),o+=2;var S={m:{a:1,b:0,c:0,d:1,tx:0,ty:0},p1:-1,p2:-1};if(s.parts.push(S),S.glyphIndex=a.readUshort(n,o),o+=2,1&g){var m=a.readShort(n,o);o+=2;var b=a.readShort(n,o);o+=2;}else {m=a.readInt8(n,o);o++;b=a.readInt8(n,o);o++;}2&g?(S.m.tx=m,S.m.ty=b):(S.p1=m,S.p2=b),8&g?(S.m.a=S.m.d=a.readF2dot14(n,o),o+=2):64&g?(S.m.a=a.readF2dot14(n,o),o+=2,S.m.d=a.readF2dot14(n,o),o+=2):128&g&&(S.m.a=a.readF2dot14(n,o),o+=2,S.m.b=a.readF2dot14(n,o),o+=2,S.m.c=a.readF2dot14(n,o),o+=2,S.m.d=a.readF2dot14(n,o),o+=2);}while(32&g);if(256&g){var y=a.readUshort(n,o);o+=2,s.instr=[];for(i=0;i<y;i++)s.instr.push(n[o]),o++;}}return s},e.GDEF={},e.GDEF.parse=function(r,t,a,n){var o=t;t+=4;var s=e._bin.readUshort(r,t);return {glyphClassDef:0===s?null:e._lctf.readClassDef(r,o+s)}},e.GPOS={},e.GPOS.parse=function(r,t,a,n){return e._lctf.parse(r,t,a,n,e.GPOS.subt)},e.GPOS.subt=function(r,t,a,n){var o=e._bin,s=a,i={};if(i.fmt=o.readUshort(r,a),a+=2,1==t||2==t||3==t||7==t||8==t&&i.fmt<=2){var h=o.readUshort(r,a);a+=2,i.coverage=e._lctf.readCoverage(r,h+s);}if(1==t&&1==i.fmt){var d=o.readUshort(r,a);a+=2,0!=d&&(i.pos=e.GPOS.readValueRecord(r,a,d));}else if(2==t&&i.fmt>=1&&i.fmt<=2){d=o.readUshort(r,a);a+=2;var f=o.readUshort(r,a);a+=2;var u=e._lctf.numOfOnes(d),l=e._lctf.numOfOnes(f);if(1==i.fmt){i.pairsets=[];var v=o.readUshort(r,a);a+=2;for(var c=0;c<v;c++){var p=s+o.readUshort(r,a);a+=2;var U=o.readUshort(r,p);p+=2;for(var g=[],S=0;S<U;S++){var m=o.readUshort(r,p);p+=2,0!=d&&(P=e.GPOS.readValueRecord(r,p,d),p+=2*u),0!=f&&(x=e.GPOS.readValueRecord(r,p,f),p+=2*l),g.push({gid2:m,val1:P,val2:x});}i.pairsets.push(g);}}if(2==i.fmt){var b=o.readUshort(r,a);a+=2;var y=o.readUshort(r,a);a+=2;var F=o.readUshort(r,a);a+=2;var C=o.readUshort(r,a);a+=2,i.classDef1=e._lctf.readClassDef(r,s+b),i.classDef2=e._lctf.readClassDef(r,s+y),i.matrix=[];for(c=0;c<F;c++){var _=[];for(S=0;S<C;S++){var P=null,x=null;0!=d&&(P=e.GPOS.readValueRecord(r,a,d),a+=2*u),0!=f&&(x=e.GPOS.readValueRecord(r,a,f),a+=2*l),_.push({val1:P,val2:x});}i.matrix.push(_);}}}else if(4==t&&1==i.fmt)i.markCoverage=e._lctf.readCoverage(r,o.readUshort(r,a)+s),i.baseCoverage=e._lctf.readCoverage(r,o.readUshort(r,a+2)+s),i.markClassCount=o.readUshort(r,a+4),i.markArray=e.GPOS.readMarkArray(r,o.readUshort(r,a+6)+s),i.baseArray=e.GPOS.readBaseArray(r,o.readUshort(r,a+8)+s,i.markClassCount);else if(6==t&&1==i.fmt)i.mark1Coverage=e._lctf.readCoverage(r,o.readUshort(r,a)+s),i.mark2Coverage=e._lctf.readCoverage(r,o.readUshort(r,a+2)+s),i.markClassCount=o.readUshort(r,a+4),i.mark1Array=e.GPOS.readMarkArray(r,o.readUshort(r,a+6)+s),i.mark2Array=e.GPOS.readBaseArray(r,o.readUshort(r,a+8)+s,i.markClassCount);else {if(9==t&&1==i.fmt){var I=o.readUshort(r,a);a+=2;var w=o.readUint(r,a);if(a+=4,9==n.ltype)n.ltype=I;else if(n.ltype!=I)throw \"invalid extension substitution\";return e.GPOS.subt(r,n.ltype,s+w)}console.debug(\"unsupported GPOS table LookupType\",t,\"format\",i.fmt);}return i},e.GPOS.readValueRecord=function(r,t,a){var n=e._bin,o=[];return o.push(1&a?n.readShort(r,t):0),t+=1&a?2:0,o.push(2&a?n.readShort(r,t):0),t+=2&a?2:0,o.push(4&a?n.readShort(r,t):0),t+=4&a?2:0,o.push(8&a?n.readShort(r,t):0),t+=8&a?2:0,o},e.GPOS.readBaseArray=function(r,t,a){var n=e._bin,o=[],s=t,i=n.readUshort(r,t);t+=2;for(var h=0;h<i;h++){for(var d=[],f=0;f<a;f++)d.push(e.GPOS.readAnchorRecord(r,s+n.readUshort(r,t))),t+=2;o.push(d);}return o},e.GPOS.readMarkArray=function(r,t){var a=e._bin,n=[],o=t,s=a.readUshort(r,t);t+=2;for(var i=0;i<s;i++){var h=e.GPOS.readAnchorRecord(r,a.readUshort(r,t+2)+o);h.markClass=a.readUshort(r,t),n.push(h),t+=4;}return n},e.GPOS.readAnchorRecord=function(r,t){var a=e._bin,n={};return n.fmt=a.readUshort(r,t),n.x=a.readShort(r,t+2),n.y=a.readShort(r,t+4),n},e.GSUB={},e.GSUB.parse=function(r,t,a,n){return e._lctf.parse(r,t,a,n,e.GSUB.subt)},e.GSUB.subt=function(r,t,a,n){var o=e._bin,s=a,i={};if(i.fmt=o.readUshort(r,a),a+=2,1!=t&&2!=t&&4!=t&&5!=t&&6!=t)return null;if(1==t||2==t||4==t||5==t&&i.fmt<=2||6==t&&i.fmt<=2){var h=o.readUshort(r,a);a+=2,i.coverage=e._lctf.readCoverage(r,s+h);}if(1==t&&i.fmt>=1&&i.fmt<=2){if(1==i.fmt)i.delta=o.readShort(r,a),a+=2;else if(2==i.fmt){var d=o.readUshort(r,a);a+=2,i.newg=o.readUshorts(r,a,d),a+=2*i.newg.length;}}else if(2==t&&1==i.fmt){d=o.readUshort(r,a);a+=2,i.seqs=[];for(var f=0;f<d;f++){var u=o.readUshort(r,a)+s;a+=2;var l=o.readUshort(r,u);i.seqs.push(o.readUshorts(r,u+2,l));}}else if(4==t){i.vals=[];d=o.readUshort(r,a);a+=2;for(f=0;f<d;f++){var v=o.readUshort(r,a);a+=2,i.vals.push(e.GSUB.readLigatureSet(r,s+v));}}else if(5==t&&2==i.fmt){if(2==i.fmt){var c=o.readUshort(r,a);a+=2,i.cDef=e._lctf.readClassDef(r,s+c),i.scset=[];var p=o.readUshort(r,a);a+=2;for(f=0;f<p;f++){var U=o.readUshort(r,a);a+=2,i.scset.push(0==U?null:e.GSUB.readSubClassSet(r,s+U));}}}else if(6==t&&3==i.fmt){if(3==i.fmt){for(f=0;f<3;f++){d=o.readUshort(r,a);a+=2;for(var g=[],S=0;S<d;S++)g.push(e._lctf.readCoverage(r,s+o.readUshort(r,a+2*S)));a+=2*d,0==f&&(i.backCvg=g),1==f&&(i.inptCvg=g),2==f&&(i.ahedCvg=g);}d=o.readUshort(r,a);a+=2,i.lookupRec=e.GSUB.readSubstLookupRecords(r,a,d);}}else {if(7==t&&1==i.fmt){var m=o.readUshort(r,a);a+=2;var b=o.readUint(r,a);if(a+=4,9==n.ltype)n.ltype=m;else if(n.ltype!=m)throw \"invalid extension substitution\";return e.GSUB.subt(r,n.ltype,s+b)}console.debug(\"unsupported GSUB table LookupType\",t,\"format\",i.fmt);}return i},e.GSUB.readSubClassSet=function(r,t){var a=e._bin.readUshort,n=t,o=[],s=a(r,t);t+=2;for(var i=0;i<s;i++){var h=a(r,t);t+=2,o.push(e.GSUB.readSubClassRule(r,n+h));}return o},e.GSUB.readSubClassRule=function(r,t){var a=e._bin.readUshort,n={},o=a(r,t),s=a(r,t+=2);t+=2,n.input=[];for(var i=0;i<o-1;i++)n.input.push(a(r,t)),t+=2;return n.substLookupRecords=e.GSUB.readSubstLookupRecords(r,t,s),n},e.GSUB.readSubstLookupRecords=function(r,t,a){for(var n=e._bin.readUshort,o=[],s=0;s<a;s++)o.push(n(r,t),n(r,t+2)),t+=4;return o},e.GSUB.readChainSubClassSet=function(r,t){var a=e._bin,n=t,o=[],s=a.readUshort(r,t);t+=2;for(var i=0;i<s;i++){var h=a.readUshort(r,t);t+=2,o.push(e.GSUB.readChainSubClassRule(r,n+h));}return o},e.GSUB.readChainSubClassRule=function(r,t){for(var a=e._bin,n={},o=[\"backtrack\",\"input\",\"lookahead\"],s=0;s<o.length;s++){var i=a.readUshort(r,t);t+=2,1==s&&i--,n[o[s]]=a.readUshorts(r,t,i),t+=2*n[o[s]].length;}i=a.readUshort(r,t);return t+=2,n.subst=a.readUshorts(r,t,2*i),t+=2*n.subst.length,n},e.GSUB.readLigatureSet=function(r,t){var a=e._bin,n=t,o=[],s=a.readUshort(r,t);t+=2;for(var i=0;i<s;i++){var h=a.readUshort(r,t);t+=2,o.push(e.GSUB.readLigature(r,n+h));}return o},e.GSUB.readLigature=function(r,t){var a=e._bin,n={chain:[]};n.nglyph=a.readUshort(r,t),t+=2;var o=a.readUshort(r,t);t+=2;for(var s=0;s<o-1;s++)n.chain.push(a.readUshort(r,t)),t+=2;return n},e.head={},e.head.parse=function(r,t,a){var n=e._bin,o={};return n.readFixed(r,t),t+=4,o.fontRevision=n.readFixed(r,t),t+=4,n.readUint(r,t),t+=4,n.readUint(r,t),t+=4,o.flags=n.readUshort(r,t),t+=2,o.unitsPerEm=n.readUshort(r,t),t+=2,o.created=n.readUint64(r,t),t+=8,o.modified=n.readUint64(r,t),t+=8,o.xMin=n.readShort(r,t),t+=2,o.yMin=n.readShort(r,t),t+=2,o.xMax=n.readShort(r,t),t+=2,o.yMax=n.readShort(r,t),t+=2,o.macStyle=n.readUshort(r,t),t+=2,o.lowestRecPPEM=n.readUshort(r,t),t+=2,o.fontDirectionHint=n.readShort(r,t),t+=2,o.indexToLocFormat=n.readShort(r,t),t+=2,o.glyphDataFormat=n.readShort(r,t),t+=2,o},e.hhea={},e.hhea.parse=function(r,t,a){var n=e._bin,o={};return n.readFixed(r,t),t+=4,o.ascender=n.readShort(r,t),t+=2,o.descender=n.readShort(r,t),t+=2,o.lineGap=n.readShort(r,t),t+=2,o.advanceWidthMax=n.readUshort(r,t),t+=2,o.minLeftSideBearing=n.readShort(r,t),t+=2,o.minRightSideBearing=n.readShort(r,t),t+=2,o.xMaxExtent=n.readShort(r,t),t+=2,o.caretSlopeRise=n.readShort(r,t),t+=2,o.caretSlopeRun=n.readShort(r,t),t+=2,o.caretOffset=n.readShort(r,t),t+=2,t+=8,o.metricDataFormat=n.readShort(r,t),t+=2,o.numberOfHMetrics=n.readUshort(r,t),t+=2,o},e.hmtx={},e.hmtx.parse=function(r,t,a,n){for(var o=e._bin,s={aWidth:[],lsBearing:[]},i=0,h=0,d=0;d<n.maxp.numGlyphs;d++)d<n.hhea.numberOfHMetrics&&(i=o.readUshort(r,t),t+=2,h=o.readShort(r,t),t+=2),s.aWidth.push(i),s.lsBearing.push(h);return s},e.kern={},e.kern.parse=function(r,t,a,n){var o=e._bin,s=o.readUshort(r,t);if(t+=2,1==s)return e.kern.parseV1(r,t-2,a,n);var i=o.readUshort(r,t);t+=2;for(var h={glyph1:[],rval:[]},d=0;d<i;d++){t+=2;a=o.readUshort(r,t);t+=2;var f=o.readUshort(r,t);t+=2;var u=f>>>8;if(0!=(u&=15))throw \"unknown kern table format: \"+u;t=e.kern.readFormat0(r,t,h);}return h},e.kern.parseV1=function(r,t,a,n){var o=e._bin;o.readFixed(r,t),t+=4;var s=o.readUint(r,t);t+=4;for(var i={glyph1:[],rval:[]},h=0;h<s;h++){o.readUint(r,t),t+=4;var d=o.readUshort(r,t);t+=2,o.readUshort(r,t),t+=2;var f=d>>>8;if(0!=(f&=15))throw \"unknown kern table format: \"+f;t=e.kern.readFormat0(r,t,i);}return i},e.kern.readFormat0=function(r,t,a){var n=e._bin,o=-1,s=n.readUshort(r,t);t+=2,n.readUshort(r,t),t+=2,n.readUshort(r,t),t+=2,n.readUshort(r,t),t+=2;for(var i=0;i<s;i++){var h=n.readUshort(r,t);t+=2;var d=n.readUshort(r,t);t+=2;var f=n.readShort(r,t);t+=2,h!=o&&(a.glyph1.push(h),a.rval.push({glyph2:[],vals:[]}));var u=a.rval[a.rval.length-1];u.glyph2.push(d),u.vals.push(f),o=h;}return t},e.loca={},e.loca.parse=function(r,t,a,n){var o=e._bin,s=[],i=n.head.indexToLocFormat,h=n.maxp.numGlyphs+1;if(0==i)for(var d=0;d<h;d++)s.push(o.readUshort(r,t+(d<<1))<<1);if(1==i)for(d=0;d<h;d++)s.push(o.readUint(r,t+(d<<2)));return s},e.maxp={},e.maxp.parse=function(r,t,a){var n=e._bin,o={},s=n.readUint(r,t);return t+=4,o.numGlyphs=n.readUshort(r,t),t+=2,65536==s&&(o.maxPoints=n.readUshort(r,t),t+=2,o.maxContours=n.readUshort(r,t),t+=2,o.maxCompositePoints=n.readUshort(r,t),t+=2,o.maxCompositeContours=n.readUshort(r,t),t+=2,o.maxZones=n.readUshort(r,t),t+=2,o.maxTwilightPoints=n.readUshort(r,t),t+=2,o.maxStorage=n.readUshort(r,t),t+=2,o.maxFunctionDefs=n.readUshort(r,t),t+=2,o.maxInstructionDefs=n.readUshort(r,t),t+=2,o.maxStackElements=n.readUshort(r,t),t+=2,o.maxSizeOfInstructions=n.readUshort(r,t),t+=2,o.maxComponentElements=n.readUshort(r,t),t+=2,o.maxComponentDepth=n.readUshort(r,t),t+=2),o},e.name={},e.name.parse=function(r,t,a){var n=e._bin,o={};n.readUshort(r,t),t+=2;var s=n.readUshort(r,t);t+=2,n.readUshort(r,t);for(var i,h=[\"copyright\",\"fontFamily\",\"fontSubfamily\",\"ID\",\"fullName\",\"version\",\"postScriptName\",\"trademark\",\"manufacturer\",\"designer\",\"description\",\"urlVendor\",\"urlDesigner\",\"licence\",\"licenceURL\",\"---\",\"typoFamilyName\",\"typoSubfamilyName\",\"compatibleFull\",\"sampleText\",\"postScriptCID\",\"wwsFamilyName\",\"wwsSubfamilyName\",\"lightPalette\",\"darkPalette\"],d=t+=2,f=0;f<s;f++){var u=n.readUshort(r,t);t+=2;var l=n.readUshort(r,t);t+=2;var v=n.readUshort(r,t);t+=2;var c=n.readUshort(r,t);t+=2;var p=n.readUshort(r,t);t+=2;var U=n.readUshort(r,t);t+=2;var g,S=h[c],m=d+12*s+U;if(0==u)g=n.readUnicode(r,m,p/2);else if(3==u&&0==l)g=n.readUnicode(r,m,p/2);else if(0==l)g=n.readASCII(r,m,p);else if(1==l)g=n.readUnicode(r,m,p/2);else if(3==l)g=n.readUnicode(r,m,p/2);else {if(1!=u)throw \"unknown encoding \"+l+\", platformID: \"+u;g=n.readASCII(r,m,p),console.debug(\"reading unknown MAC encoding \"+l+\" as ASCII\");}var b=\"p\"+u+\",\"+v.toString(16);null==o[b]&&(o[b]={}),o[b][void 0!==S?S:c]=g,o[b]._lang=v;}for(var y in o)if(null!=o[y].postScriptName&&1033==o[y]._lang)return o[y];for(var y in o)if(null!=o[y].postScriptName&&0==o[y]._lang)return o[y];for(var y in o)if(null!=o[y].postScriptName&&3084==o[y]._lang)return o[y];for(var y in o)if(null!=o[y].postScriptName)return o[y];for(var y in o){i=y;break}return console.debug(\"returning name table with languageID \"+o[i]._lang),o[i]},e[\"OS/2\"]={},e[\"OS/2\"].parse=function(r,t,a){var n=e._bin.readUshort(r,t);t+=2;var o={};if(0==n)e[\"OS/2\"].version0(r,t,o);else if(1==n)e[\"OS/2\"].version1(r,t,o);else if(2==n||3==n||4==n)e[\"OS/2\"].version2(r,t,o);else {if(5!=n)throw \"unknown OS/2 table version: \"+n;e[\"OS/2\"].version5(r,t,o);}return o},e[\"OS/2\"].version0=function(r,t,a){var n=e._bin;return a.xAvgCharWidth=n.readShort(r,t),t+=2,a.usWeightClass=n.readUshort(r,t),t+=2,a.usWidthClass=n.readUshort(r,t),t+=2,a.fsType=n.readUshort(r,t),t+=2,a.ySubscriptXSize=n.readShort(r,t),t+=2,a.ySubscriptYSize=n.readShort(r,t),t+=2,a.ySubscriptXOffset=n.readShort(r,t),t+=2,a.ySubscriptYOffset=n.readShort(r,t),t+=2,a.ySuperscriptXSize=n.readShort(r,t),t+=2,a.ySuperscriptYSize=n.readShort(r,t),t+=2,a.ySuperscriptXOffset=n.readShort(r,t),t+=2,a.ySuperscriptYOffset=n.readShort(r,t),t+=2,a.yStrikeoutSize=n.readShort(r,t),t+=2,a.yStrikeoutPosition=n.readShort(r,t),t+=2,a.sFamilyClass=n.readShort(r,t),t+=2,a.panose=n.readBytes(r,t,10),t+=10,a.ulUnicodeRange1=n.readUint(r,t),t+=4,a.ulUnicodeRange2=n.readUint(r,t),t+=4,a.ulUnicodeRange3=n.readUint(r,t),t+=4,a.ulUnicodeRange4=n.readUint(r,t),t+=4,a.achVendID=[n.readInt8(r,t),n.readInt8(r,t+1),n.readInt8(r,t+2),n.readInt8(r,t+3)],t+=4,a.fsSelection=n.readUshort(r,t),t+=2,a.usFirstCharIndex=n.readUshort(r,t),t+=2,a.usLastCharIndex=n.readUshort(r,t),t+=2,a.sTypoAscender=n.readShort(r,t),t+=2,a.sTypoDescender=n.readShort(r,t),t+=2,a.sTypoLineGap=n.readShort(r,t),t+=2,a.usWinAscent=n.readUshort(r,t),t+=2,a.usWinDescent=n.readUshort(r,t),t+=2},e[\"OS/2\"].version1=function(r,t,a){var n=e._bin;return t=e[\"OS/2\"].version0(r,t,a),a.ulCodePageRange1=n.readUint(r,t),t+=4,a.ulCodePageRange2=n.readUint(r,t),t+=4},e[\"OS/2\"].version2=function(r,t,a){var n=e._bin;return t=e[\"OS/2\"].version1(r,t,a),a.sxHeight=n.readShort(r,t),t+=2,a.sCapHeight=n.readShort(r,t),t+=2,a.usDefault=n.readUshort(r,t),t+=2,a.usBreak=n.readUshort(r,t),t+=2,a.usMaxContext=n.readUshort(r,t),t+=2},e[\"OS/2\"].version5=function(r,t,a){var n=e._bin;return t=e[\"OS/2\"].version2(r,t,a),a.usLowerOpticalPointSize=n.readUshort(r,t),t+=2,a.usUpperOpticalPointSize=n.readUshort(r,t),t+=2},e.post={},e.post.parse=function(r,t,a){var n=e._bin,o={};return o.version=n.readFixed(r,t),t+=4,o.italicAngle=n.readFixed(r,t),t+=4,o.underlinePosition=n.readShort(r,t),t+=2,o.underlineThickness=n.readShort(r,t),t+=2,o},null==e&&(e={}),null==e.U&&(e.U={}),e.U.codeToGlyph=function(r,e){var t=r.cmap,a=-1;if(null!=t.p0e4?a=t.p0e4:null!=t.p3e1?a=t.p3e1:null!=t.p1e0?a=t.p1e0:null!=t.p0e3&&(a=t.p0e3),-1==a)throw \"no familiar platform and encoding!\";var n=t.tables[a];if(0==n.format)return e>=n.map.length?0:n.map[e];if(4==n.format){for(var o=-1,s=0;s<n.endCount.length;s++)if(e<=n.endCount[s]){o=s;break}if(-1==o)return 0;if(n.startCount[o]>e)return 0;return 65535&(0!=n.idRangeOffset[o]?n.glyphIdArray[e-n.startCount[o]+(n.idRangeOffset[o]>>1)-(n.idRangeOffset.length-o)]:e+n.idDelta[o])}if(12==n.format){if(e>n.groups[n.groups.length-1][1])return 0;for(s=0;s<n.groups.length;s++){var i=n.groups[s];if(i[0]<=e&&e<=i[1])return i[2]+(e-i[0])}return 0}throw \"unknown cmap table format \"+n.format},e.U.glyphToPath=function(r,t){var a={cmds:[],crds:[]};if(r.SVG&&r.SVG.entries[t]){var n=r.SVG.entries[t];return null==n?a:(\"string\"==typeof n&&(n=e.SVG.toPath(n),r.SVG.entries[t]=n),n)}if(r.CFF){var o={x:0,y:0,stack:[],nStems:0,haveWidth:!1,width:r.CFF.Private?r.CFF.Private.defaultWidthX:0,open:!1},s=r.CFF,i=r.CFF.Private;if(s.ROS){for(var h=0;s.FDSelect[h+2]<=t;)h+=2;i=s.FDArray[s.FDSelect[h+1]].Private;}e.U._drawCFF(r.CFF.CharStrings[t],o,s,i,a);}else r.glyf&&e.U._drawGlyf(t,r,a);return a},e.U._drawGlyf=function(r,t,a){var n=t.glyf[r];null==n&&(n=t.glyf[r]=e.glyf._parseGlyf(t,r)),null!=n&&(n.noc>-1?e.U._simpleGlyph(n,a):e.U._compoGlyph(n,t,a));},e.U._simpleGlyph=function(r,t){for(var a=0;a<r.noc;a++){for(var n=0==a?0:r.endPts[a-1]+1,o=r.endPts[a],s=n;s<=o;s++){var i=s==n?o:s-1,h=s==o?n:s+1,d=1&r.flags[s],f=1&r.flags[i],u=1&r.flags[h],l=r.xs[s],v=r.ys[s];if(s==n)if(d){if(!f){e.U.P.moveTo(t,l,v);continue}e.U.P.moveTo(t,r.xs[i],r.ys[i]);}else f?e.U.P.moveTo(t,r.xs[i],r.ys[i]):e.U.P.moveTo(t,(r.xs[i]+l)/2,(r.ys[i]+v)/2);d?f&&e.U.P.lineTo(t,l,v):u?e.U.P.qcurveTo(t,l,v,r.xs[h],r.ys[h]):e.U.P.qcurveTo(t,l,v,(l+r.xs[h])/2,(v+r.ys[h])/2);}e.U.P.closePath(t);}},e.U._compoGlyph=function(r,t,a){for(var n=0;n<r.parts.length;n++){var o={cmds:[],crds:[]},s=r.parts[n];e.U._drawGlyf(s.glyphIndex,t,o);for(var i=s.m,h=0;h<o.crds.length;h+=2){var d=o.crds[h],f=o.crds[h+1];a.crds.push(d*i.a+f*i.b+i.tx),a.crds.push(d*i.c+f*i.d+i.ty);}for(h=0;h<o.cmds.length;h++)a.cmds.push(o.cmds[h]);}},e.U._getGlyphClass=function(r,t){var a=e._lctf.getInterval(t,r);return -1==a?0:t[a+2]},e.U._applySubs=function(r,t,a,n){for(var o=r.length-t-1,s=0;s<a.tabs.length;s++)if(null!=a.tabs[s]){var i,h=a.tabs[s];if(!h.coverage||-1!=(i=e._lctf.coverageIndex(h.coverage,r[t])))if(1==a.ltype)r[t],1==h.fmt?r[t]=r[t]+h.delta:r[t]=h.newg[i];else if(4==a.ltype)for(var d=h.vals[i],f=0;f<d.length;f++){var u=d[f],l=u.chain.length;if(!(l>o)){for(var v=!0,c=0,p=0;p<l;p++){for(;-1==r[t+c+(1+p)];)c++;u.chain[p]!=r[t+c+(1+p)]&&(v=!1);}if(v){r[t]=u.nglyph;for(p=0;p<l+c;p++)r[t+p+1]=-1;break}}}else if(5==a.ltype&&2==h.fmt)for(var U=e._lctf.getInterval(h.cDef,r[t]),g=h.cDef[U+2],S=h.scset[g],m=0;m<S.length;m++){var b=S[m],y=b.input;if(!(y.length>o)){for(v=!0,p=0;p<y.length;p++){var F=e._lctf.getInterval(h.cDef,r[t+1+p]);if(-1==U&&h.cDef[F+2]!=y[p]){v=!1;break}}if(v){var C=b.substLookupRecords;for(f=0;f<C.length;f+=2)C[f],C[f+1];}}}else if(6==a.ltype&&3==h.fmt){if(!e.U._glsCovered(r,h.backCvg,t-h.backCvg.length))continue;if(!e.U._glsCovered(r,h.inptCvg,t))continue;if(!e.U._glsCovered(r,h.ahedCvg,t+h.inptCvg.length))continue;var _=h.lookupRec;for(m=0;m<_.length;m+=2){U=_[m];var P=n[_[m+1]];e.U._applySubs(r,t+U,P,n);}}}},e.U._glsCovered=function(r,t,a){for(var n=0;n<t.length;n++){if(-1==e._lctf.coverageIndex(t[n],r[a+n]))return !1}return !0},e.U.glyphsToPath=function(r,t,a){for(var n={cmds:[],crds:[]},o=0,s=0;s<t.length;s++){var i=t[s];if(-1!=i){for(var h=s<t.length-1&&-1!=t[s+1]?t[s+1]:0,d=e.U.glyphToPath(r,i),f=0;f<d.crds.length;f+=2)n.crds.push(d.crds[f]+o),n.crds.push(d.crds[f+1]);a&&n.cmds.push(a);for(f=0;f<d.cmds.length;f++)n.cmds.push(d.cmds[f]);a&&n.cmds.push(\"X\"),o+=r.hmtx.aWidth[i],s<t.length-1&&(o+=e.U.getPairAdjustment(r,i,h));}}return n},e.U.P={},e.U.P.moveTo=function(r,e,t){r.cmds.push(\"M\"),r.crds.push(e,t);},e.U.P.lineTo=function(r,e,t){r.cmds.push(\"L\"),r.crds.push(e,t);},e.U.P.curveTo=function(r,e,t,a,n,o,s){r.cmds.push(\"C\"),r.crds.push(e,t,a,n,o,s);},e.U.P.qcurveTo=function(r,e,t,a,n){r.cmds.push(\"Q\"),r.crds.push(e,t,a,n);},e.U.P.closePath=function(r){r.cmds.push(\"Z\");},e.U._drawCFF=function(r,t,a,n,o){for(var s=t.stack,i=t.nStems,h=t.haveWidth,d=t.width,f=t.open,u=0,l=t.x,v=t.y,c=0,p=0,U=0,g=0,S=0,m=0,b=0,y=0,F=0,C=0,_={val:0,size:0};u<r.length;){e.CFF.getCharString(r,u,_);var P=_.val;if(u+=_.size,\"o1\"==P||\"o18\"==P)s.length%2!=0&&!h&&(d=s.shift()+n.nominalWidthX),i+=s.length>>1,s.length=0,h=!0;else if(\"o3\"==P||\"o23\"==P){s.length%2!=0&&!h&&(d=s.shift()+n.nominalWidthX),i+=s.length>>1,s.length=0,h=!0;}else if(\"o4\"==P)s.length>1&&!h&&(d=s.shift()+n.nominalWidthX,h=!0),f&&e.U.P.closePath(o),v+=s.pop(),e.U.P.moveTo(o,l,v),f=!0;else if(\"o5\"==P)for(;s.length>0;)l+=s.shift(),v+=s.shift(),e.U.P.lineTo(o,l,v);else if(\"o6\"==P||\"o7\"==P)for(var x=s.length,I=\"o6\"==P,w=0;w<x;w++){var k=s.shift();I?l+=k:v+=k,I=!I,e.U.P.lineTo(o,l,v);}else if(\"o8\"==P||\"o24\"==P){x=s.length;for(var G=0;G+6<=x;)c=l+s.shift(),p=v+s.shift(),U=c+s.shift(),g=p+s.shift(),l=U+s.shift(),v=g+s.shift(),e.U.P.curveTo(o,c,p,U,g,l,v),G+=6;\"o24\"==P&&(l+=s.shift(),v+=s.shift(),e.U.P.lineTo(o,l,v));}else {if(\"o11\"==P)break;if(\"o1234\"==P||\"o1235\"==P||\"o1236\"==P||\"o1237\"==P)\"o1234\"==P&&(p=v,U=(c=l+s.shift())+s.shift(),C=g=p+s.shift(),m=g,y=v,l=(b=(S=(F=U+s.shift())+s.shift())+s.shift())+s.shift(),e.U.P.curveTo(o,c,p,U,g,F,C),e.U.P.curveTo(o,S,m,b,y,l,v)),\"o1235\"==P&&(c=l+s.shift(),p=v+s.shift(),U=c+s.shift(),g=p+s.shift(),F=U+s.shift(),C=g+s.shift(),S=F+s.shift(),m=C+s.shift(),b=S+s.shift(),y=m+s.shift(),l=b+s.shift(),v=y+s.shift(),s.shift(),e.U.P.curveTo(o,c,p,U,g,F,C),e.U.P.curveTo(o,S,m,b,y,l,v)),\"o1236\"==P&&(c=l+s.shift(),p=v+s.shift(),U=c+s.shift(),C=g=p+s.shift(),m=g,b=(S=(F=U+s.shift())+s.shift())+s.shift(),y=m+s.shift(),l=b+s.shift(),e.U.P.curveTo(o,c,p,U,g,F,C),e.U.P.curveTo(o,S,m,b,y,l,v)),\"o1237\"==P&&(c=l+s.shift(),p=v+s.shift(),U=c+s.shift(),g=p+s.shift(),F=U+s.shift(),C=g+s.shift(),S=F+s.shift(),m=C+s.shift(),b=S+s.shift(),y=m+s.shift(),Math.abs(b-l)>Math.abs(y-v)?l=b+s.shift():v=y+s.shift(),e.U.P.curveTo(o,c,p,U,g,F,C),e.U.P.curveTo(o,S,m,b,y,l,v));else if(\"o14\"==P){if(s.length>0&&!h&&(d=s.shift()+a.nominalWidthX,h=!0),4==s.length){var O=s.shift(),T=s.shift(),D=s.shift(),B=s.shift(),A=e.CFF.glyphBySE(a,D),R=e.CFF.glyphBySE(a,B);e.U._drawCFF(a.CharStrings[A],t,a,n,o),t.x=O,t.y=T,e.U._drawCFF(a.CharStrings[R],t,a,n,o);}f&&(e.U.P.closePath(o),f=!1);}else if(\"o19\"==P||\"o20\"==P){s.length%2!=0&&!h&&(d=s.shift()+n.nominalWidthX),i+=s.length>>1,s.length=0,h=!0,u+=i+7>>3;}else if(\"o21\"==P)s.length>2&&!h&&(d=s.shift()+n.nominalWidthX,h=!0),v+=s.pop(),l+=s.pop(),f&&e.U.P.closePath(o),e.U.P.moveTo(o,l,v),f=!0;else if(\"o22\"==P)s.length>1&&!h&&(d=s.shift()+n.nominalWidthX,h=!0),l+=s.pop(),f&&e.U.P.closePath(o),e.U.P.moveTo(o,l,v),f=!0;else if(\"o25\"==P){for(;s.length>6;)l+=s.shift(),v+=s.shift(),e.U.P.lineTo(o,l,v);c=l+s.shift(),p=v+s.shift(),U=c+s.shift(),g=p+s.shift(),l=U+s.shift(),v=g+s.shift(),e.U.P.curveTo(o,c,p,U,g,l,v);}else if(\"o26\"==P)for(s.length%2&&(l+=s.shift());s.length>0;)c=l,p=v+s.shift(),l=U=c+s.shift(),v=(g=p+s.shift())+s.shift(),e.U.P.curveTo(o,c,p,U,g,l,v);else if(\"o27\"==P)for(s.length%2&&(v+=s.shift());s.length>0;)p=v,U=(c=l+s.shift())+s.shift(),g=p+s.shift(),l=U+s.shift(),v=g,e.U.P.curveTo(o,c,p,U,g,l,v);else if(\"o10\"==P||\"o29\"==P){var L=\"o10\"==P?n:a;if(0==s.length)console.debug(\"error: empty stack\");else {var W=s.pop(),M=L.Subrs[W+L.Bias];t.x=l,t.y=v,t.nStems=i,t.haveWidth=h,t.width=d,t.open=f,e.U._drawCFF(M,t,a,n,o),l=t.x,v=t.y,i=t.nStems,h=t.haveWidth,d=t.width,f=t.open;}}else if(\"o30\"==P||\"o31\"==P){var V=s.length,E=(G=0,\"o31\"==P);for(G+=V-(x=-3&V);G<x;)E?(p=v,U=(c=l+s.shift())+s.shift(),v=(g=p+s.shift())+s.shift(),x-G==5?(l=U+s.shift(),G++):l=U,E=!1):(c=l,p=v+s.shift(),U=c+s.shift(),g=p+s.shift(),l=U+s.shift(),x-G==5?(v=g+s.shift(),G++):v=g,E=!0),e.U.P.curveTo(o,c,p,U,g,l,v),G+=4;}else {if(\"o\"==(P+\"\").charAt(0))throw console.debug(\"Unknown operation: \"+P,r),P;s.push(P);}}}t.x=l,t.y=v,t.nStems=i,t.haveWidth=h,t.width=d,t.open=f;};var t=e,a={Typr:t};return r.Typr=t,r.default=a,Object.defineProperty(r,\"__esModule\",{value:!0}),r}({}).Typr}\n\n/*!\nCustom bundle of woff2otf (https://github.com/arty-name/woff2otf) with fflate\n(https://github.com/101arrowz/fflate) for use in Troika text rendering. \nOriginal licenses apply: \n- fflate: https://github.com/101arrowz/fflate/blob/master/LICENSE (MIT)\n- woff2otf.js: https://github.com/arty-name/woff2otf/blob/master/woff2otf.js (Apache2)\n*/\nfunction woff2otfFactory(){return function(r){var e=Uint8Array,n=Uint16Array,t=Uint32Array,a=new e([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,0,0,0]),i=new e([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,0,0]),o=new e([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),f=function(r,e){for(var a=new n(31),i=0;i<31;++i)a[i]=e+=1<<r[i-1];var o=new t(a[30]);for(i=1;i<30;++i)for(var f=a[i];f<a[i+1];++f)o[f]=f-a[i]<<5|i;return [a,o]},u=f(a,2),v=u[0],s=u[1];v[28]=258,s[258]=28;for(var l=f(i,0)[0],c=new n(32768),g=0;g<32768;++g){var h=(43690&g)>>>1|(21845&g)<<1;h=(61680&(h=(52428&h)>>>2|(13107&h)<<2))>>>4|(3855&h)<<4,c[g]=((65280&h)>>>8|(255&h)<<8)>>>1;}var w=function(r,e,t){for(var a=r.length,i=0,o=new n(e);i<a;++i)++o[r[i]-1];var f,u=new n(e);for(i=0;i<e;++i)u[i]=u[i-1]+o[i-1]<<1;if(t){f=new n(1<<e);var v=15-e;for(i=0;i<a;++i)if(r[i])for(var s=i<<4|r[i],l=e-r[i],g=u[r[i]-1]++<<l,h=g|(1<<l)-1;g<=h;++g)f[c[g]>>>v]=s;}else for(f=new n(a),i=0;i<a;++i)r[i]&&(f[i]=c[u[r[i]-1]++]>>>15-r[i]);return f},d=new e(288);for(g=0;g<144;++g)d[g]=8;for(g=144;g<256;++g)d[g]=9;for(g=256;g<280;++g)d[g]=7;for(g=280;g<288;++g)d[g]=8;var m=new e(32);for(g=0;g<32;++g)m[g]=5;var b=w(d,9,1),p=w(m,5,1),y=function(r){for(var e=r[0],n=1;n<r.length;++n)r[n]>e&&(e=r[n]);return e},L=function(r,e,n){var t=e/8|0;return (r[t]|r[t+1]<<8)>>(7&e)&n},U=function(r,e){var n=e/8|0;return (r[n]|r[n+1]<<8|r[n+2]<<16)>>(7&e)},k=[\"unexpected EOF\",\"invalid block type\",\"invalid length/literal\",\"invalid distance\",\"stream finished\",\"no stream handler\",,\"no callback\",\"invalid UTF-8 data\",\"extra field too long\",\"date not in range 1980-2099\",\"filename too long\",\"stream finishing\",\"invalid zip data\"],T=function(r,e,n){var t=new Error(e||k[r]);if(t.code=r,Error.captureStackTrace&&Error.captureStackTrace(t,T),!n)throw t;return t},O=function(r,f,u){var s=r.length;if(!s||u&&!u.l&&s<5)return f||new e(0);var c=!f||u,g=!u||u.i;u||(u={}),f||(f=new e(3*s));var h,d=function(r){var n=f.length;if(r>n){var t=new e(Math.max(2*n,r));t.set(f),f=t;}},m=u.f||0,k=u.p||0,O=u.b||0,A=u.l,x=u.d,E=u.m,D=u.n,M=8*s;do{if(!A){u.f=m=L(r,k,1);var S=L(r,k+1,3);if(k+=3,!S){var V=r[(I=((h=k)/8|0)+(7&h&&1)+4)-4]|r[I-3]<<8,_=I+V;if(_>s){g&&T(0);break}c&&d(O+V),f.set(r.subarray(I,_),O),u.b=O+=V,u.p=k=8*_;continue}if(1==S)A=b,x=p,E=9,D=5;else if(2==S){var j=L(r,k,31)+257,z=L(r,k+10,15)+4,C=j+L(r,k+5,31)+1;k+=14;for(var F=new e(C),P=new e(19),q=0;q<z;++q)P[o[q]]=L(r,k+3*q,7);k+=3*z;var B=y(P),G=(1<<B)-1,H=w(P,B,1);for(q=0;q<C;){var I,J=H[L(r,k,G)];if(k+=15&J,(I=J>>>4)<16)F[q++]=I;else {var K=0,N=0;for(16==I?(N=3+L(r,k,3),k+=2,K=F[q-1]):17==I?(N=3+L(r,k,7),k+=3):18==I&&(N=11+L(r,k,127),k+=7);N--;)F[q++]=K;}}var Q=F.subarray(0,j),R=F.subarray(j);E=y(Q),D=y(R),A=w(Q,E,1),x=w(R,D,1);}else T(1);if(k>M){g&&T(0);break}}c&&d(O+131072);for(var W=(1<<E)-1,X=(1<<D)-1,Y=k;;Y=k){var Z=(K=A[U(r,k)&W])>>>4;if((k+=15&K)>M){g&&T(0);break}if(K||T(2),Z<256)f[O++]=Z;else {if(256==Z){Y=k,A=null;break}var $=Z-254;if(Z>264){var rr=a[q=Z-257];$=L(r,k,(1<<rr)-1)+v[q],k+=rr;}var er=x[U(r,k)&X],nr=er>>>4;er||T(3),k+=15&er;R=l[nr];if(nr>3){rr=i[nr];R+=U(r,k)&(1<<rr)-1,k+=rr;}if(k>M){g&&T(0);break}c&&d(O+131072);for(var tr=O+$;O<tr;O+=4)f[O]=f[O-R],f[O+1]=f[O+1-R],f[O+2]=f[O+2-R],f[O+3]=f[O+3-R];O=tr;}}u.l=A,u.p=Y,u.b=O,A&&(m=1,u.m=E,u.d=x,u.n=D);}while(!m);return O==f.length?f:function(r,a,i){(null==a||a<0)&&(a=0),(null==i||i>r.length)&&(i=r.length);var o=new(r instanceof n?n:r instanceof t?t:e)(i-a);return o.set(r.subarray(a,i)),o}(f,0,O)},A=new e(0);var x=\"undefined\"!=typeof TextDecoder&&new TextDecoder;try{x.decode(A,{stream:!0}),1;}catch(r){}return r.convert_streams=function(r){var e=new DataView(r),n=0;function t(){var r=e.getUint16(n);return n+=2,r}function a(){var r=e.getUint32(n);return n+=4,r}function i(r){m.setUint16(b,r),b+=2;}function o(r){m.setUint32(b,r),b+=4;}for(var f={signature:a(),flavor:a(),length:a(),numTables:t(),reserved:t(),totalSfntSize:a(),majorVersion:t(),minorVersion:t(),metaOffset:a(),metaLength:a(),metaOrigLength:a(),privOffset:a(),privLength:a()},u=0;Math.pow(2,u)<=f.numTables;)u++;u--;for(var v=16*Math.pow(2,u),s=16*f.numTables-v,l=12,c=[],g=0;g<f.numTables;g++)c.push({tag:a(),offset:a(),compLength:a(),origLength:a(),origChecksum:a()}),l+=16;var h,w=new Uint8Array(12+16*c.length+c.reduce((function(r,e){return r+e.origLength+4}),0)),d=w.buffer,m=new DataView(d),b=0;return o(f.flavor),i(f.numTables),i(v),i(u),i(s),c.forEach((function(r){o(r.tag),o(r.origChecksum),o(l),o(r.origLength),r.outOffset=l,(l+=r.origLength)%4!=0&&(l+=4-l%4);})),c.forEach((function(e){var n,t=r.slice(e.offset,e.offset+e.compLength);if(e.compLength!=e.origLength){var a=new Uint8Array(e.origLength);n=new Uint8Array(t,2),O(n,a);}else a=new Uint8Array(t);w.set(a,e.outOffset);var i=0;(l=e.outOffset+e.origLength)%4!=0&&(i=4-l%4),w.set(new Uint8Array(i).buffer,e.outOffset+e.origLength),h=l+i;})),d.slice(0,h)},Object.defineProperty(r,\"__esModule\",{value:!0}),r}({}).convert_streams}\n\n/**\n * A factory wrapper parsing a font file using Typr.\n * Also adds support for WOFF files (not WOFF2).\n */\n\n/**\n * @typedef ParsedFont\n * @property {number} ascender\n * @property {number} descender\n * @property {number} xHeight\n * @property {(number) => boolean} supportsCodePoint\n * @property {(text:string, fontSize:number, letterSpacing:number, callback) => number} forEachGlyph\n * @property {number} lineGap\n * @property {number} capHeight\n * @property {number} unitsPerEm\n */\n\n/**\n * @typedef {(buffer: ArrayBuffer) => ParsedFont} FontParser\n */\n\n/**\n * @returns {FontParser}\n */\nfunction parserFactory(Typr, woff2otf) {\n const cmdArgLengths = {\n M: 2,\n L: 2,\n Q: 4,\n C: 6,\n Z: 0\n };\n\n // {joinType: \"skip+step,...\"}\n const joiningTypeRawData = {\"C\":\"18g,ca,368,1kz\",\"D\":\"17k,6,2,2+4,5+c,2+6,2+1,10+1,9+f,j+11,2+1,a,2,2+1,15+2,3,j+2,6+3,2+8,2,2,2+1,w+a,4+e,3+3,2,3+2,3+5,23+w,2f+4,3,2+9,2,b,2+3,3,1k+9,6+1,3+1,2+2,2+d,30g,p+y,1,1+1g,f+x,2,sd2+1d,jf3+4,f+3,2+4,2+2,b+3,42,2,4+2,2+1,2,3,t+1,9f+w,2,el+2,2+g,d+2,2l,2+1,5,3+1,2+1,2,3,6,16wm+1v\",\"R\":\"17m+3,2,2,6+3,m,15+2,2+2,h+h,13,3+8,2,2,3+1,2,p+1,x,5+4,5,a,2,2,3,u,c+2,g+1,5,2+1,4+1,5j,6+1,2,b,2+2,f,2+1,1s+2,2,3+1,7,1ez0,2,2+1,4+4,b,4,3,b,42,2+2,4,3,2+1,2,o+3,ae,ep,x,2o+2,3+1,3,5+1,6\",\"L\":\"x9u,jff,a,fd,jv\",\"T\":\"4t,gj+33,7o+4,1+1,7c+18,2,2+1,2+1,2,21+a,2,1b+k,h,2u+6,3+5,3+1,2+3,y,2,v+q,2k+a,1n+8,a,p+3,2+8,2+2,2+4,18+2,3c+e,2+v,1k,2,5+7,5,4+6,b+1,u,1n,5+3,9,l+1,r,3+1,1m,5+1,5+1,3+2,4,v+1,4,c+1,1m,5+4,2+1,5,l+1,n+5,2,1n,3,2+3,9,8+1,c+1,v,1q,d,1f,4,1m+2,6+2,2+3,8+1,c+1,u,1n,3,7,6+1,l+1,t+1,1m+1,5+3,9,l+1,u,21,8+2,2,2j,3+6,d+7,2r,3+8,c+5,23+1,s,2,2,1k+d,2+4,2+1,6+a,2+z,a,2v+3,2+5,2+1,3+1,q+1,5+2,h+3,e,3+1,7,g,jk+2,qb+2,u+2,u+1,v+1,1t+1,2+6,9,3+a,a,1a+2,3c+1,z,3b+2,5+1,a,7+2,64+1,3,1n,2+6,2,2,3+7,7+9,3,1d+d,1,1+1,1s+3,1d,2+4,2,6,15+8,d+1,x+3,3+1,2+2,1l,2+1,4,2+2,1n+7,3+1,49+2,2+c,2+6,5,7,4+1,5j+1l,2+4,ek,3+1,r+4,1e+4,6+5,2p+c,1+3,1,1+2,1+b,2db+2,3y,2p+v,ff+3,30+1,n9x,1+2,2+9,x+1,29+1,7l,4,5,q+1,6,48+1,r+h,e,13+7,q+a,1b+2,1d,3+3,3+1,14,1w+5,3+1,3+1,d,9,1c,1g,2+2,3+1,6+1,2,17+1,9,6n,3,5,fn5,ki+f,h+f,5s,6y+2,ea,6b,46+4,1af+2,2+1,6+3,15+2,5,4m+1,fy+3,as+1,4a+a,4x,1j+e,1l+2,1e+3,3+1,1y+2,11+4,2+7,1r,d+1,1h+8,b+3,3,2o+2,3,2+1,7,4h,4+7,m+1,1m+1,4,12+6,4+4,5g+7,3+2,2,o,2d+5,2,5+1,2+1,6n+3,7+1,2+1,s+1,2e+7,3,2+1,2z,2,3+5,2,2u+2,3+3,2+4,78+8,2+1,75+1,2,5,41+3,3+1,5,x+9,15+5,3+3,9,a+5,3+2,1b+c,2+1,bb+6,2+5,2,2b+l,3+6,2+1,2+1,3f+5,4,2+1,2+6,2,21+1,4,2,9o+1,470+8,at4+4,1o+6,t5,1s+3,2a,f5l+1,2+3,43o+2,a+7,1+7,3+6,v+3,45+2,1j0+1i,5+1d,9,f,n+4,2+e,11t+6,2+g,3+6,2+1,2+4,7a+6,c6+3,15t+6,32+6,1,gzau,v+2n,3l+6n\"};\n\n const JT_LEFT = 1, //indicates that a character joins with the subsequent character, but does not join with the preceding character.\n JT_RIGHT = 2, //indicates that a character joins with the preceding character, but does not join with the subsequent character.\n JT_DUAL = 4, //indicates that a character joins with the preceding character and joins with the subsequent character.\n JT_TRANSPARENT = 8, //indicates that the character does not join with adjacent characters and that the character must be skipped over when the shaping engine is evaluating the joining positions in a sequence of characters. When a JT_TRANSPARENT character is encountered in a sequence, the JOINING_TYPE of the preceding character passes through. Diacritical marks are frequently assigned this value.\n JT_JOIN_CAUSING = 16, //indicates that the character forces the use of joining forms with the preceding and subsequent characters. Kashidas and the Zero Width Joiner (U+200D) are both JOIN_CAUSING characters.\n JT_NON_JOINING = 32; //indicates that a character does not join with the preceding or with the subsequent character.,\n\n let joiningTypeMap;\n function getCharJoiningType(ch) {\n if (!joiningTypeMap) {\n const m = {\n R: JT_RIGHT,\n L: JT_LEFT,\n D: JT_DUAL,\n C: JT_JOIN_CAUSING,\n U: JT_NON_JOINING,\n T: JT_TRANSPARENT\n };\n joiningTypeMap = new Map();\n for (let type in joiningTypeRawData) {\n let lastCode = 0;\n joiningTypeRawData[type].split(',').forEach(range => {\n let [skip, step] = range.split('+');\n skip = parseInt(skip,36);\n step = step ? parseInt(step, 36) : 0;\n joiningTypeMap.set(lastCode += skip, m[type]);\n for (let i = step; i--;) {\n joiningTypeMap.set(++lastCode, m[type]);\n }\n });\n }\n }\n return joiningTypeMap.get(ch) || JT_NON_JOINING\n }\n\n const ISOL = 1, INIT = 2, FINA = 3, MEDI = 4;\n const formsToFeatures = [null, 'isol', 'init', 'fina', 'medi'];\n\n function detectJoiningForms(str) {\n // This implements the algorithm described here:\n // https://github.com/n8willis/opentype-shaping-documents/blob/master/opentype-shaping-arabic-general.md\n const joiningForms = new Uint8Array(str.length);\n let prevJoiningType = JT_NON_JOINING;\n let prevForm = ISOL;\n let prevIndex = -1;\n for (let i = 0; i < str.length; i++) {\n const code = str.codePointAt(i);\n let joiningType = getCharJoiningType(code) | 0;\n let form = ISOL;\n if (joiningType & JT_TRANSPARENT) {\n continue\n }\n if (prevJoiningType & (JT_LEFT | JT_DUAL | JT_JOIN_CAUSING)) {\n if (joiningType & (JT_RIGHT | JT_DUAL | JT_JOIN_CAUSING)) {\n form = FINA;\n // isol->init, fina->medi\n if (prevForm === ISOL || prevForm === FINA) {\n joiningForms[prevIndex]++;\n }\n }\n else if (joiningType & (JT_LEFT | JT_NON_JOINING)) {\n // medi->fina, init->isol\n if (prevForm === INIT || prevForm === MEDI) {\n joiningForms[prevIndex]--;\n }\n }\n }\n else if (prevJoiningType & (JT_RIGHT | JT_NON_JOINING)) {\n // medi->fina, init->isol\n if (prevForm === INIT || prevForm === MEDI) {\n joiningForms[prevIndex]--;\n }\n }\n prevForm = joiningForms[i] = form;\n prevJoiningType = joiningType;\n prevIndex = i;\n if (code > 0xffff) i++;\n }\n // console.log(str.split('').map(ch => ch.codePointAt(0).toString(16)))\n // console.log(str.split('').map(ch => getCharJoiningType(ch.codePointAt(0))))\n // console.log(Array.from(joiningForms).map(f => formsToFeatures[f] || 'none'))\n return joiningForms\n }\n\n function stringToGlyphs (font, str) {\n const glyphIds = [];\n for (let i = 0; i < str.length; i++) {\n const cc = str.codePointAt(i);\n if (cc > 0xffff) i++;\n glyphIds.push(Typr.U.codeToGlyph(font, cc));\n }\n\n const gsub = font['GSUB'];\n if (gsub) {\n const {lookupList, featureList} = gsub;\n let joiningForms;\n const supportedFeatures = /^(rlig|liga|mset|isol|init|fina|medi|half|pres|blws|ccmp)$/;\n const usedLookups = [];\n featureList.forEach(feature => {\n if (supportedFeatures.test(feature.tag)) {\n for (let ti = 0; ti < feature.tab.length; ti++) {\n if (usedLookups[feature.tab[ti]]) continue\n usedLookups[feature.tab[ti]] = true;\n const tab = lookupList[feature.tab[ti]];\n const isJoiningFeature = /^(isol|init|fina|medi)$/.test(feature.tag);\n if (isJoiningFeature && !joiningForms) { //lazy\n joiningForms = detectJoiningForms(str);\n }\n for (let ci = 0; ci < glyphIds.length; ci++) {\n if (!joiningForms || !isJoiningFeature || formsToFeatures[joiningForms[ci]] === feature.tag) {\n Typr.U._applySubs(glyphIds, ci, tab, lookupList);\n }\n }\n }\n }\n });\n }\n\n return glyphIds\n }\n\n // Calculate advances and x/y offsets for each glyph, e.g. kerning and mark\n // attachments. This is a more complete version of Typr.U.getPairAdjustment\n // and should become an upstream replacement eventually.\n function calcGlyphPositions(font, glyphIds) {\n const positions = new Int16Array(glyphIds.length * 3); // [offsetX, offsetY, advanceX, ...]\n let glyphIndex = 0;\n for (; glyphIndex < glyphIds.length; glyphIndex++) {\n const glyphId = glyphIds[glyphIndex];\n if (glyphId === -1) continue;\n\n positions[glyphIndex * 3 + 2] = font.hmtx.aWidth[glyphId]; // populate advanceX in...advance.\n\n const gpos = font.GPOS;\n if (gpos) {\n const llist = gpos.lookupList;\n for (let i = 0; i < llist.length; i++) {\n const lookup = llist[i];\n for (let j = 0; j < lookup.tabs.length; j++) {\n const tab = lookup.tabs[j];\n // Single char placement\n if (lookup.ltype === 1) {\n const ind = Typr._lctf.coverageIndex(tab.coverage, glyphId);\n if (ind !== -1 && tab.pos) {\n applyValueRecord(tab.pos, glyphIndex);\n break\n }\n }\n // Pairs (kerning)\n else if (lookup.ltype === 2) {\n let adj = null;\n let prevGlyphIndex = getPrevGlyphIndex();\n if (prevGlyphIndex !== -1) {\n const coverageIndex = Typr._lctf.coverageIndex(tab.coverage, glyphIds[prevGlyphIndex]);\n if (coverageIndex !== -1) {\n if (tab.fmt === 1) {\n const right = tab.pairsets[coverageIndex];\n for (let k = 0; k < right.length; k++) {\n if (right[k].gid2 === glyphId) adj = right[k];\n }\n } else if (tab.fmt === 2) {\n const c1 = Typr.U._getGlyphClass(glyphIds[prevGlyphIndex], tab.classDef1);\n const c2 = Typr.U._getGlyphClass(glyphId, tab.classDef2);\n adj = tab.matrix[c1][c2];\n }\n if (adj) {\n if (adj.val1) applyValueRecord(adj.val1, prevGlyphIndex);\n if (adj.val2) applyValueRecord(adj.val2, glyphIndex);\n break\n }\n }\n }\n }\n // Mark to base\n else if (lookup.ltype === 4) {\n const markArrIndex = Typr._lctf.coverageIndex(tab.markCoverage, glyphId);\n if (markArrIndex !== -1) {\n const baseGlyphIndex = getPrevGlyphIndex(isBaseGlyph);\n const baseArrIndex = baseGlyphIndex === -1 ? -1 : Typr._lctf.coverageIndex(tab.baseCoverage, glyphIds[baseGlyphIndex]);\n if (baseArrIndex !== -1) {\n const markRecord = tab.markArray[markArrIndex];\n const baseAnchor = tab.baseArray[baseArrIndex][markRecord.markClass];\n positions[glyphIndex * 3] = baseAnchor.x - markRecord.x + positions[baseGlyphIndex * 3] - positions[baseGlyphIndex * 3 + 2];\n positions[glyphIndex * 3 + 1] = baseAnchor.y - markRecord.y + positions[baseGlyphIndex * 3 + 1];\n break;\n }\n }\n }\n // Mark to mark\n else if (lookup.ltype === 6) {\n const mark1ArrIndex = Typr._lctf.coverageIndex(tab.mark1Coverage, glyphId);\n if (mark1ArrIndex !== -1) {\n const prevGlyphIndex = getPrevGlyphIndex();\n if (prevGlyphIndex !== -1) {\n const prevGlyphId = glyphIds[prevGlyphIndex];\n if (getGlyphClass(font, prevGlyphId) === 3) { // only check mark glyphs\n const mark2ArrIndex = Typr._lctf.coverageIndex(tab.mark2Coverage, prevGlyphId);\n if (mark2ArrIndex !== -1) {\n const mark1Record = tab.mark1Array[mark1ArrIndex];\n const mark2Anchor = tab.mark2Array[mark2ArrIndex][mark1Record.markClass];\n positions[glyphIndex * 3] = mark2Anchor.x - mark1Record.x + positions[prevGlyphIndex * 3] - positions[prevGlyphIndex * 3 + 2];\n positions[glyphIndex * 3 + 1] = mark2Anchor.y - mark1Record.y + positions[prevGlyphIndex * 3 + 1];\n break;\n }\n }\n }\n }\n }\n }\n }\n }\n // Check kern table if no GPOS\n else if (font.kern && !font.cff) {\n const prevGlyphIndex = getPrevGlyphIndex();\n if (prevGlyphIndex !== -1) {\n const ind1 = font.kern.glyph1.indexOf(glyphIds[prevGlyphIndex]);\n if (ind1 !== -1) {\n const ind2 = font.kern.rval[ind1].glyph2.indexOf(glyphId);\n if (ind2 !== -1) {\n positions[prevGlyphIndex * 3 + 2] += font.kern.rval[ind1].vals[ind2];\n }\n }\n }\n }\n }\n\n return positions;\n\n function getPrevGlyphIndex(filter) {\n for (let i = glyphIndex - 1; i >=0; i--) {\n if (glyphIds[i] !== -1 && (!filter || filter(glyphIds[i]))) {\n return i\n }\n }\n return -1;\n }\n\n function isBaseGlyph(glyphId) {\n return getGlyphClass(font, glyphId) === 1;\n }\n\n function applyValueRecord(source, gi) {\n for (let i = 0; i < 3; i++) {\n positions[gi * 3 + i] += source[i] || 0;\n }\n }\n }\n\n function getGlyphClass(font, glyphId) {\n const classDef = font.GDEF && font.GDEF.glyphClassDef;\n return classDef ? Typr.U._getGlyphClass(glyphId, classDef) : 0;\n }\n\n function firstNum(...args) {\n for (let i = 0; i < args.length; i++) {\n if (typeof args[i] === 'number') {\n return args[i]\n }\n }\n }\n\n /**\n * @returns ParsedFont\n */\n function wrapFontObj(typrFont) {\n const glyphMap = Object.create(null);\n\n const os2 = typrFont['OS/2'];\n const hhea = typrFont.hhea;\n const unitsPerEm = typrFont.head.unitsPerEm;\n const ascender = firstNum(os2 && os2.sTypoAscender, hhea && hhea.ascender, unitsPerEm);\n\n /** @type ParsedFont */\n const fontObj = {\n unitsPerEm,\n ascender,\n descender: firstNum(os2 && os2.sTypoDescender, hhea && hhea.descender, 0),\n capHeight: firstNum(os2 && os2.sCapHeight, ascender),\n xHeight: firstNum(os2 && os2.sxHeight, ascender),\n lineGap: firstNum(os2 && os2.sTypoLineGap, hhea && hhea.lineGap),\n supportsCodePoint(code) {\n return Typr.U.codeToGlyph(typrFont, code) > 0\n },\n forEachGlyph(text, fontSize, letterSpacing, callback) {\n let penX = 0;\n const fontScale = 1 / fontObj.unitsPerEm * fontSize;\n\n const glyphIds = stringToGlyphs(typrFont, text);\n let charIndex = 0;\n const positions = calcGlyphPositions(typrFont, glyphIds);\n\n glyphIds.forEach((glyphId, i) => {\n // Typr returns a glyph index per string codepoint, with -1s in place of those that\n // were omitted due to ligature substitution. So we can track original index in the\n // string via simple increment, and skip everything else when seeing a -1.\n if (glyphId !== -1) {\n let glyphObj = glyphMap[glyphId];\n if (!glyphObj) {\n const {cmds, crds} = Typr.U.glyphToPath(typrFont, glyphId);\n\n // Build path string\n let path = '';\n let crdsIdx = 0;\n for (let i = 0, len = cmds.length; i < len; i++) {\n const numArgs = cmdArgLengths[cmds[i]];\n path += cmds[i];\n for (let j = 1; j <= numArgs; j++) {\n path += (j > 1 ? ',' : '') + crds[crdsIdx++];\n }\n }\n\n // Find extents - Glyf gives this in metadata but not CFF, and Typr doesn't\n // normalize the two, so it's simplest just to iterate ourselves.\n let xMin, yMin, xMax, yMax;\n if (crds.length) {\n xMin = yMin = Infinity;\n xMax = yMax = -Infinity;\n for (let i = 0, len = crds.length; i < len; i += 2) {\n let x = crds[i];\n let y = crds[i + 1];\n if (x < xMin) xMin = x;\n if (y < yMin) yMin = y;\n if (x > xMax) xMax = x;\n if (y > yMax) yMax = y;\n }\n } else {\n xMin = xMax = yMin = yMax = 0;\n }\n\n glyphObj = glyphMap[glyphId] = {\n index: glyphId,\n advanceWidth: typrFont.hmtx.aWidth[glyphId],\n xMin,\n yMin,\n xMax,\n yMax,\n path,\n };\n }\n\n callback.call(\n null,\n glyphObj,\n penX + positions[i * 3] * fontScale,\n positions[i * 3 + 1] * fontScale,\n charIndex\n );\n\n penX += positions[i * 3 + 2] * fontScale;\n if (letterSpacing) {\n penX += letterSpacing * fontSize;\n }\n }\n charIndex += (text.codePointAt(charIndex) > 0xffff ? 2 : 1);\n });\n\n return penX\n }\n };\n\n return fontObj\n }\n\n /**\n * @type FontParser\n */\n return function parse(buffer) {\n // Look to see if we have a WOFF file and convert it if so:\n const peek = new Uint8Array(buffer, 0, 4);\n const tag = Typr._bin.readASCII(peek, 0, 4);\n if (tag === 'wOFF') {\n buffer = woff2otf(buffer);\n } else if (tag === 'wOF2') {\n throw new Error('woff2 fonts not supported')\n }\n return wrapFontObj(Typr.parse(buffer)[0])\n }\n}\n\n\nconst workerModule = /*#__PURE__*/defineWorkerModule({\n name: 'Typr Font Parser',\n dependencies: [typrFactory, woff2otfFactory, parserFactory],\n init(typrFactory, woff2otfFactory, parserFactory) {\n const Typr = typrFactory();\n const woff2otf = woff2otfFactory();\n return parserFactory(Typr, woff2otf)\n }\n});\n\n/*!\nCustom bundle of @unicode-font-resolver/client v1.0.2 (https://github.com/lojjic/unicode-font-resolver)\nfor use in Troika text rendering. \nOriginal MIT license applies\n*/\nfunction unicodeFontResolverClientFactory(){return function(t){var n=function(){this.buckets=new Map;};n.prototype.add=function(t){var n=t>>5;this.buckets.set(n,(this.buckets.get(n)||0)|1<<(31&t));},n.prototype.has=function(t){var n=this.buckets.get(t>>5);return void 0!==n&&0!=(n&1<<(31&t))},n.prototype.serialize=function(){var t=[];return this.buckets.forEach((function(n,r){t.push((+r).toString(36)+\":\"+n.toString(36));})),t.join(\",\")},n.prototype.deserialize=function(t){var n=this;this.buckets.clear(),t.split(\",\").forEach((function(t){var r=t.split(\":\");n.buckets.set(parseInt(r[0],36),parseInt(r[1],36));}));};var r=Math.pow(2,8),e=r-1,o=~e;function a(t){var n=function(t){return t&o}(t).toString(16),e=function(t){return (t&o)+r-1}(t).toString(16);return \"codepoint-index/plane\"+(t>>16)+\"/\"+n+\"-\"+e+\".json\"}function i(t,n){var r=t&e,o=n.codePointAt(r/6|0);return 0!=((o=(o||48)-48)&1<<r%6)}function u(t,n){var r;(r=t,r.replace(/U\\+/gi,\"\").replace(/^,+|,+$/g,\"\").split(/,+/).map((function(t){return t.split(\"-\").map((function(t){return parseInt(t.trim(),16)}))}))).forEach((function(t){var r=t[0],e=t[1];void 0===e&&(e=r),n(r,e);}));}function c(t,n){u(t,(function(t,r){for(var e=t;e<=r;e++)n(e);}));}var s={},f={},l=new WeakMap,v=\"https://cdn.jsdelivr.net/gh/lojjic/unicode-font-resolver@v1.0.1/packages/data\";function d(t){var r=l.get(t);return r||(r=new n,c(t.ranges,(function(t){return r.add(t)})),l.set(t,r)),r}var h,p=new Map;function g(t,n,r){return t[n]?n:t[r]?r:function(t){for(var n in t)return n}(t)}function w(t,n){var r=n;if(!t.includes(r)){r=1/0;for(var e=0;e<t.length;e++)Math.abs(t[e]-n)<Math.abs(r-n)&&(r=t[e]);}return r}function k(t){return h||(h=new Set,c(\"9-D,20,85,A0,1680,2000-200A,2028-202F,205F,3000\",(function(t){h.add(t);}))),h.has(t)}return t.CodePointSet=n,t.clearCache=function(){s={},f={};},t.getFontsForString=function(t,n){void 0===n&&(n={});var r,e=n.lang;void 0===e&&(e=/\\p{Script=Hangul}/u.test(r=t)?\"ko\":/\\p{Script=Hiragana}|\\p{Script=Katakana}/u.test(r)?\"ja\":\"en\");var o=n.category;void 0===o&&(o=\"sans-serif\");var u=n.style;void 0===u&&(u=\"normal\");var c=n.weight;void 0===c&&(c=400);var l=(n.dataUrl||v).replace(/\\/$/g,\"\"),h=new Map,y=new Uint8Array(t.length),b={},m={},A=new Array(t.length),S=new Map,j=!1;function M(t){var n=p.get(t);return n||(n=fetch(l+\"/\"+t).then((function(t){if(!t.ok)throw new Error(t.statusText);return t.json().then((function(t){if(!Array.isArray(t)||1!==t[0])throw new Error(\"Incorrect schema version; need 1, got \"+t[0]);return t[1]}))})).catch((function(n){if(l!==v)return j||(console.error('unicode-font-resolver: Failed loading from dataUrl \"'+l+'\", trying default CDN. '+n.message),j=!0),l=v,p.delete(t),M(t);throw n})),p.set(t,n)),n}for(var P=function(n){var r=t.codePointAt(n),e=a(r);A[n]=e,s[e]||S.has(e)||S.set(e,M(e).then((function(t){s[e]=t;}))),r>65535&&(n++,E=n);},E=0;E<t.length;E++)P(E);return Promise.all(S.values()).then((function(){S.clear();for(var n=function(n){var o=t.codePointAt(n),a=null,u=s[A[n]],c=void 0;for(var l in u){var v=m[l];if(void 0===v&&(v=m[l]=new RegExp(l).test(e||\"en\")),v){for(var d in c=l,u[l])if(i(o,u[l][d])){a=d;break}break}}if(!a)t:for(var h in u)if(h!==c)for(var p in u[h])if(i(o,u[h][p])){a=p;break t}a||(console.debug(\"No font coverage for U+\"+o.toString(16)),a=\"latin\"),A[n]=a,f[a]||S.has(a)||S.set(a,M(\"font-meta/\"+a+\".json\").then((function(t){f[a]=t;}))),o>65535&&(n++,r=n);},r=0;r<t.length;r++)n(r);return Promise.all(S.values())})).then((function(){for(var n,r=null,e=0;e<t.length;e++){var a=t.codePointAt(e);if(r&&(k(a)||d(r).has(a)))y[e]=y[e-1];else {r=f[A[e]];var i=b[r.id];if(!i){var s=r.typeforms,v=g(s,o,\"sans-serif\"),p=g(s[v],u,\"normal\"),m=w(null===(n=s[v])||void 0===n?void 0:n[p],c);i=b[r.id]=l+\"/font-files/\"+r.id+\"/\"+v+\".\"+p+\".\"+m+\".woff\";}var S=h.get(i);null==S&&(S=h.size,h.set(i,S)),y[e]=S;}a>65535&&(e++,y[e]=y[e-1]);}return {fontUrls:Array.from(h.keys()),chars:y}}))},Object.defineProperty(t,\"__esModule\",{value:!0}),t}({})}\n\n/**\n * @typedef {string | {src:string, label?:string, unicodeRange?:string, lang?:string}} UserFont\n */\n\n/**\n * @typedef {ClientOptions} FontResolverOptions\n * @property {Array<UserFont>|UserFont} [fonts]\n * @property {'normal'|'italic'} [style]\n * @property {'normal'|'bold'|number} [style]\n * @property {string} [unicodeFontsURL]\n */\n\n/**\n * @typedef {Object} FontResolverResult\n * @property {Uint8Array} chars\n * @property {Array<ParsedFont & {src:string}>} fonts\n */\n\n/**\n * @typedef {function} FontResolver\n * @param {string} text\n * @param {(FontResolverResult) => void} callback\n * @param {FontResolverOptions} [options]\n */\n\n/**\n * Factory for the FontResolver function.\n * @param {FontParser} fontParser\n * @param {{getFontsForString: function, CodePointSet: function}} unicodeFontResolverClient\n * @return {FontResolver}\n */\nfunction createFontResolver(fontParser, unicodeFontResolverClient) {\n /**\n * @type {Record<string, ParsedFont>}\n */\n const parsedFonts = Object.create(null);\n\n /**\n * @type {Record<string, Array<(ParsedFont) => void>>}\n */\n const loadingFonts = Object.create(null);\n\n /**\n * Load a given font url\n */\n function doLoadFont(url, callback) {\n const onError = err => {\n console.error(`Failure loading font ${url}`, err);\n };\n try {\n const request = new XMLHttpRequest();\n request.open('get', url, true);\n request.responseType = 'arraybuffer';\n request.onload = function () {\n if (request.status >= 400) {\n onError(new Error(request.statusText));\n }\n else if (request.status > 0) {\n try {\n const fontObj = fontParser(request.response);\n fontObj.src = url;\n callback(fontObj);\n } catch (e) {\n onError(e);\n }\n }\n };\n request.onerror = onError;\n request.send();\n } catch(err) {\n onError(err);\n }\n }\n\n\n /**\n * Load a given font url if needed, invoking a callback when it's loaded. If already\n * loaded, the callback will be called synchronously.\n * @param {string} fontUrl\n * @param {(font: ParsedFont) => void} callback\n */\n function loadFont(fontUrl, callback) {\n let font = parsedFonts[fontUrl];\n if (font) {\n callback(font);\n } else if (loadingFonts[fontUrl]) {\n loadingFonts[fontUrl].push(callback);\n } else {\n loadingFonts[fontUrl] = [callback];\n doLoadFont(fontUrl, fontObj => {\n fontObj.src = fontUrl;\n parsedFonts[fontUrl] = fontObj;\n loadingFonts[fontUrl].forEach(cb => cb(fontObj));\n delete loadingFonts[fontUrl];\n });\n }\n }\n\n /**\n * For a given string of text, determine which fonts are required to fully render it and\n * ensure those fonts are loaded.\n */\n return function (text, callback, {\n lang,\n fonts: userFonts = [],\n style = 'normal',\n weight = 'normal',\n unicodeFontsURL\n } = {}) {\n const charResolutions = new Uint8Array(text.length);\n const fontResolutions = [];\n if (!text.length) {\n allDone();\n }\n\n const fontIndices = new Map();\n const fallbackRanges = []; // [[start, end], ...]\n\n if (style !== 'italic') style = 'normal';\n if (typeof weight !== 'number') {\n weight = weight === 'bold' ? 700 : 400;\n }\n\n if (userFonts && !Array.isArray(userFonts)) {\n userFonts = [userFonts];\n }\n userFonts = userFonts.slice()\n // filter by language\n .filter(def => !def.lang || def.lang.test(lang))\n // switch order for easier iteration\n .reverse();\n if (userFonts.length) {\n const UNKNOWN = 0;\n const RESOLVED = 1;\n const NEEDS_FALLBACK = 2;\n let prevCharResult = UNKNOWN\n\n ;(function resolveUserFonts (startIndex = 0) {\n for (let i = startIndex, iLen = text.length; i < iLen; i++) {\n const codePoint = text.codePointAt(i);\n // Carry previous character's result forward if:\n // - it resolved to a font that also covers this character\n // - this character is whitespace\n if (\n (prevCharResult === RESOLVED && fontResolutions[charResolutions[i - 1]].supportsCodePoint(codePoint)) ||\n (i > 0 && /\\s/.test(text[i]))\n ) {\n charResolutions[i] = charResolutions[i - 1];\n if (prevCharResult === NEEDS_FALLBACK) {\n fallbackRanges[fallbackRanges.length - 1][1] = i;\n }\n } else {\n for (let j = charResolutions[i], jLen = userFonts.length; j <= jLen; j++) {\n if (j === jLen) {\n // none of the user fonts matched; needs fallback\n const range = prevCharResult === NEEDS_FALLBACK ?\n fallbackRanges[fallbackRanges.length - 1] :\n (fallbackRanges[fallbackRanges.length] = [i, i]);\n range[1] = i;\n prevCharResult = NEEDS_FALLBACK;\n } else {\n charResolutions[i] = j;\n const { src, unicodeRange } = userFonts[j];\n // filter by optional explicit unicode ranges\n if (!unicodeRange || isCodeInRanges(codePoint, unicodeRange)) {\n const fontObj = parsedFonts[src];\n // font not yet loaded, load it and resume\n if (!fontObj) {\n loadFont(src, () => {\n resolveUserFonts(i);\n });\n return;\n }\n // if the font actually contains a glyph for this char, lock it in\n if (fontObj.supportsCodePoint(codePoint)) {\n let fontIndex = fontIndices.get(fontObj);\n if (typeof fontIndex !== 'number') {\n fontIndex = fontResolutions.length;\n fontResolutions.push(fontObj);\n fontIndices.set(fontObj, fontIndex);\n }\n charResolutions[i] = fontIndex;\n prevCharResult = RESOLVED;\n break;\n }\n }\n }\n }\n }\n\n if (codePoint > 0xffff && i + 1 < iLen) {\n charResolutions[i + 1] = charResolutions[i];\n i++;\n if (prevCharResult === NEEDS_FALLBACK) {\n fallbackRanges[fallbackRanges.length - 1][1] = i;\n }\n }\n }\n resolveFallbacks();\n })();\n } else {\n fallbackRanges.push([0, text.length - 1]);\n resolveFallbacks();\n }\n\n function resolveFallbacks() {\n if (fallbackRanges.length) {\n // Combine all fallback substrings into a single string for querying\n const fallbackString = fallbackRanges.map(range => text.substring(range[0], range[1] + 1)).join('\\n');\n unicodeFontResolverClient.getFontsForString(fallbackString, {\n lang: lang || undefined,\n style,\n weight,\n dataUrl: unicodeFontsURL\n }).then(({fontUrls, chars}) => {\n // Extract results and put them back in the main array\n const fontIndexOffset = fontResolutions.length;\n let charIdx = 0;\n fallbackRanges.forEach(range => {\n for (let i = 0, endIdx = range[1] - range[0]; i <= endIdx; i++) {\n charResolutions[range[0] + i] = chars[charIdx++] + fontIndexOffset;\n }\n charIdx++; //skip segment separator\n });\n\n // Load and parse the fallback fonts - avoiding Promise here to prevent polyfills in the worker\n let loadedCount = 0;\n fontUrls.forEach((url, i) => {\n loadFont(url, fontObj => {\n fontResolutions[i + fontIndexOffset] = fontObj;\n if (++loadedCount === fontUrls.length) {\n allDone();\n }\n });\n });\n });\n } else {\n allDone();\n }\n }\n\n function allDone() {\n callback({\n chars: charResolutions,\n fonts: fontResolutions\n });\n }\n\n function isCodeInRanges(code, ranges) {\n // todo optimize search - CodePointSet from unicode-font-resolver?\n for (let k = 0; k < ranges.length; k++) {\n const [start, end = start] = ranges[k];\n if (start <= code && code <= end) {\n return true\n }\n }\n return false\n }\n }\n}\n\nconst fontResolverWorkerModule = /*#__PURE__*/defineWorkerModule({\n name: 'FontResolver',\n dependencies: [\n createFontResolver,\n workerModule,\n unicodeFontResolverClientFactory,\n ],\n init(createFontResolver, fontParser, unicodeFontResolverClientFactory) {\n return createFontResolver(fontParser, unicodeFontResolverClientFactory());\n }\n});\n\n/**\n * @typedef {number|'left'|'center'|'right'} AnchorXValue\n */\n/**\n * @typedef {number|'top'|'top-baseline'|'top-cap'|'top-ex'|'middle'|'bottom-baseline'|'bottom'} AnchorYValue\n */\n\n/**\n * @typedef {object} TypesetParams\n * @property {string} text\n * @property {UserFont|UserFont[]} [font]\n * @property {string} [lang]\n * @property {number} [sdfGlyphSize=64]\n * @property {number} [fontSize=1]\n * @property {number|'normal'|'bold'} [fontWeight='normal']\n * @property {'normal'|'italic'} [fontStyle='normal']\n * @property {number} [letterSpacing=0]\n * @property {'normal'|number} [lineHeight='normal']\n * @property {number} [maxWidth]\n * @property {'ltr'|'rtl'} [direction='ltr']\n * @property {string} [textAlign='left']\n * @property {number} [textIndent=0]\n * @property {'normal'|'nowrap'} [whiteSpace='normal']\n * @property {'normal'|'break-word'} [overflowWrap='normal']\n * @property {AnchorXValue} [anchorX=0]\n * @property {AnchorYValue} [anchorY=0]\n * @property {boolean} [metricsOnly=false]\n * @property {string} [unicodeFontsURL]\n * @property {FontResolverResult} [preResolvedFonts]\n * @property {boolean} [includeCaretPositions=false]\n * @property {number} [chunkedBoundsSize=8192]\n * @property {{[rangeStartIndex]: number}} [colorRanges]\n */\n\n/**\n * @typedef {object} TypesetResult\n * @property {Uint16Array} glyphIds id for each glyph, specific to that glyph's font\n * @property {Uint8Array} glyphFontIndices index into fontData for each glyph\n * @property {Float32Array} glyphPositions x,y of each glyph's origin in layout\n * @property {{[font]: {[glyphId]: {path: string, pathBounds: number[]}}}} glyphData data about each glyph appearing in the text\n * @property {TypesetFontData[]} fontData data about each font used in the text\n * @property {Float32Array} [caretPositions] startX,endX,bottomY caret positions for each char\n * @property {Uint8Array} [glyphColors] color for each glyph, if color ranges supplied\n * chunkedBounds, //total rects per (n=chunkedBoundsSize) consecutive glyphs\n * fontSize, //calculated em height\n * topBaseline: anchorYOffset + lines[0].baseline, //y coordinate of the top line's baseline\n * blockBounds: [ //bounds for the whole block of text, including vertical padding for lineHeight\n * anchorXOffset,\n * anchorYOffset - totalHeight,\n * anchorXOffset + maxLineWidth,\n * anchorYOffset\n * ],\n * visibleBounds, //total bounds of visible text paths, may be larger or smaller than blockBounds\n * timings\n */\n\n/**\n * @typedef {object} TypesetFontData\n * @property src\n * @property unitsPerEm\n * @property ascender\n * @property descender\n * @property lineHeight\n * @property capHeight\n * @property xHeight\n */\n\n/**\n * @typedef {function} TypesetterTypesetFunction - compute fonts and layout for some text.\n * @param {TypesetParams} params\n * @param {(TypesetResult) => void} callback - function called when typesetting is complete.\n * If the params included `preResolvedFonts`, this will be called synchronously.\n */\n\n/**\n * @typedef {function} TypesetterMeasureFunction - compute width/height for some text.\n * @param {TypesetParams} params\n * @param {(width:number, height:number) => void} callback - function called when measurement is complete.\n * If the params included `preResolvedFonts`, this will be called synchronously.\n */\n\n\n/**\n * Factory function that creates a self-contained environment for processing text typesetting requests.\n *\n * It is important that this function has no closure dependencies, so that it can be easily injected\n * into the source for a Worker without requiring a build step or complex dependency loading. All its\n * dependencies must be passed in at initialization.\n *\n * @param {FontResolver} resolveFonts - function to resolve a string to parsed fonts\n * @param {object} bidi - the bidi.js implementation object\n * @return {{typeset: TypesetterTypesetFunction, measure: TypesetterMeasureFunction}}\n */\nfunction createTypesetter(resolveFonts, bidi) {\n const INF = Infinity;\n\n // Set of Unicode Default_Ignorable_Code_Point characters, these will not produce visible glyphs\n // eslint-disable-next-line no-misleading-character-class\n const DEFAULT_IGNORABLE_CHARS = /[\\u00AD\\u034F\\u061C\\u115F-\\u1160\\u17B4-\\u17B5\\u180B-\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u3164\\uFE00-\\uFE0F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8]/;\n\n // This regex (instead of /\\s/) allows us to select all whitespace EXCEPT for non-breaking white spaces\n const lineBreakingWhiteSpace = `[^\\\\S\\\\u00A0]`;\n\n // Incomplete set of characters that allow line breaking after them\n // In the future we may consider a full Unicode line breaking algorithm impl: https://www.unicode.org/reports/tr14\n const BREAK_AFTER_CHARS = new RegExp(`${lineBreakingWhiteSpace}|[\\\\-\\\\u007C\\\\u00AD\\\\u2010\\\\u2012-\\\\u2014\\\\u2027\\\\u2056\\\\u2E17\\\\u2E40]`);\n\n /**\n * Load and parse all the necessary fonts to render a given string of text, then group\n * them into consecutive runs of characters sharing a font.\n */\n function calculateFontRuns({text, lang, fonts, style, weight, preResolvedFonts, unicodeFontsURL}, onDone) {\n const onResolved = ({chars, fonts: parsedFonts}) => {\n let curRun, prevVal;\n const runs = [];\n for (let i = 0; i < chars.length; i++) {\n if (chars[i] !== prevVal) {\n prevVal = chars[i];\n runs.push(curRun = { start: i, end: i, fontObj: parsedFonts[chars[i]]});\n } else {\n curRun.end = i;\n }\n }\n onDone(runs);\n };\n if (preResolvedFonts) {\n onResolved(preResolvedFonts);\n } else {\n resolveFonts(\n text,\n onResolved,\n { lang, fonts, style, weight, unicodeFontsURL }\n );\n }\n }\n\n /**\n * Main entry point.\n * Process a text string with given font and formatting parameters, and return all info\n * necessary to render all its glyphs.\n * @type TypesetterTypesetFunction\n */\n function typeset(\n {\n text='',\n font,\n lang,\n sdfGlyphSize=64,\n fontSize=400,\n fontWeight=1,\n fontStyle='normal',\n letterSpacing=0,\n lineHeight='normal',\n maxWidth=INF,\n direction,\n textAlign='left',\n textIndent=0,\n whiteSpace='normal',\n overflowWrap='normal',\n anchorX = 0,\n anchorY = 0,\n metricsOnly=false,\n unicodeFontsURL,\n preResolvedFonts=null,\n includeCaretPositions=false,\n chunkedBoundsSize=8192,\n colorRanges=null\n },\n callback\n ) {\n const mainStart = now();\n const timings = {fontLoad: 0, typesetting: 0};\n\n // Ensure newlines are normalized\n if (text.indexOf('\\r') > -1) {\n console.info('Typesetter: got text with \\\\r chars; normalizing to \\\\n');\n text = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n }\n\n // Ensure we've got numbers not strings\n fontSize = +fontSize;\n letterSpacing = +letterSpacing;\n maxWidth = +maxWidth;\n lineHeight = lineHeight || 'normal';\n textIndent = +textIndent;\n\n calculateFontRuns({\n text,\n lang,\n style: fontStyle,\n weight: fontWeight,\n fonts: typeof font === 'string' ? [{src: font}] : font,\n unicodeFontsURL,\n preResolvedFonts\n }, runs => {\n timings.fontLoad = now() - mainStart;\n const hasMaxWidth = isFinite(maxWidth);\n let glyphIds = null;\n let glyphFontIndices = null;\n let glyphPositions = null;\n let glyphData = null;\n let glyphColors = null;\n let caretPositions = null;\n let visibleBounds = null;\n let chunkedBounds = null;\n let maxLineWidth = 0;\n let renderableGlyphCount = 0;\n let canWrap = whiteSpace !== 'nowrap';\n const metricsByFont = new Map(); // fontObj -> metrics\n const typesetStart = now();\n\n // Distribute glyphs into lines based on wrapping\n let lineXOffset = textIndent;\n let prevRunEndX = 0;\n let currentLine = new TextLine();\n const lines = [currentLine];\n runs.forEach(run => {\n const { fontObj } = run;\n const { ascender, descender, unitsPerEm, lineGap, capHeight, xHeight } = fontObj;\n\n // Calculate metrics for each font used\n let fontData = metricsByFont.get(fontObj);\n if (!fontData) {\n // Find conversion between native font units and fontSize units\n const fontSizeMult = fontSize / unitsPerEm;\n\n // Determine appropriate value for 'normal' line height based on the font's actual metrics\n // This does not guarantee individual glyphs won't exceed the line height, e.g. Roboto; should we use yMin/Max instead?\n const calcLineHeight = lineHeight === 'normal' ?\n (ascender - descender + lineGap) * fontSizeMult : lineHeight * fontSize;\n\n // Determine line height and leading adjustments\n const halfLeading = (calcLineHeight - (ascender - descender) * fontSizeMult) / 2;\n const caretHeight = Math.min(calcLineHeight, (ascender - descender) * fontSizeMult);\n const caretTop = (ascender + descender) / 2 * fontSizeMult + caretHeight / 2;\n fontData = {\n index: metricsByFont.size,\n src: fontObj.src,\n fontObj,\n fontSizeMult,\n unitsPerEm,\n ascender: ascender * fontSizeMult,\n descender: descender * fontSizeMult,\n capHeight: capHeight * fontSizeMult,\n xHeight: xHeight * fontSizeMult,\n lineHeight: calcLineHeight,\n baseline: -halfLeading - ascender * fontSizeMult, // baseline offset from top of line height\n // cap: -halfLeading - capHeight * fontSizeMult, // cap from top of line height\n // ex: -halfLeading - xHeight * fontSizeMult, // ex from top of line height\n caretTop,\n caretBottom: caretTop - caretHeight\n };\n metricsByFont.set(fontObj, fontData);\n }\n const { fontSizeMult } = fontData;\n\n const runText = text.slice(run.start, run.end + 1);\n let prevGlyphX, prevGlyphObj;\n fontObj.forEachGlyph(runText, fontSize, letterSpacing, (glyphObj, glyphX, glyphY, charIndex) => {\n glyphX += prevRunEndX;\n charIndex += run.start;\n prevGlyphX = glyphX;\n prevGlyphObj = glyphObj;\n const char = text.charAt(charIndex);\n const glyphWidth = glyphObj.advanceWidth * fontSizeMult;\n const curLineCount = currentLine.count;\n let nextLine;\n\n // Calc isWhitespace and isEmpty once per glyphObj\n if (!('isEmpty' in glyphObj)) {\n glyphObj.isWhitespace = !!char && new RegExp(lineBreakingWhiteSpace).test(char);\n glyphObj.canBreakAfter = !!char && BREAK_AFTER_CHARS.test(char);\n glyphObj.isEmpty = glyphObj.xMin === glyphObj.xMax || glyphObj.yMin === glyphObj.yMax || DEFAULT_IGNORABLE_CHARS.test(char);\n }\n if (!glyphObj.isWhitespace && !glyphObj.isEmpty) {\n renderableGlyphCount++;\n }\n\n // If a non-whitespace character overflows the max width, we need to soft-wrap\n if (canWrap && hasMaxWidth && !glyphObj.isWhitespace && glyphX + glyphWidth + lineXOffset > maxWidth && curLineCount) {\n // If it's the first char after a whitespace, start a new line\n if (currentLine.glyphAt(curLineCount - 1).glyphObj.canBreakAfter) {\n nextLine = new TextLine();\n lineXOffset = -glyphX;\n } else {\n // Back up looking for a whitespace character to wrap at\n for (let i = curLineCount; i--;) {\n // If we got the start of the line there's no soft break point; make hard break if overflowWrap='break-word'\n if (i === 0 && overflowWrap === 'break-word') {\n nextLine = new TextLine();\n lineXOffset = -glyphX;\n break\n }\n // Found a soft break point; move all chars since it to a new line\n else if (currentLine.glyphAt(i).glyphObj.canBreakAfter) {\n nextLine = currentLine.splitAt(i + 1);\n const adjustX = nextLine.glyphAt(0).x;\n lineXOffset -= adjustX;\n for (let j = nextLine.count; j--;) {\n nextLine.glyphAt(j).x -= adjustX;\n }\n break\n }\n }\n }\n if (nextLine) {\n currentLine.isSoftWrapped = true;\n currentLine = nextLine;\n lines.push(currentLine);\n maxLineWidth = maxWidth; //after soft wrapping use maxWidth as calculated width\n }\n }\n\n let fly = currentLine.glyphAt(currentLine.count);\n fly.glyphObj = glyphObj;\n fly.x = glyphX + lineXOffset;\n fly.y = glyphY;\n fly.width = glyphWidth;\n fly.charIndex = charIndex;\n fly.fontData = fontData;\n\n // Handle hard line breaks\n if (char === '\\n') {\n currentLine = new TextLine();\n lines.push(currentLine);\n lineXOffset = -(glyphX + glyphWidth + (letterSpacing * fontSize)) + textIndent;\n }\n });\n // At the end of a run we must capture the x position as the starting point for the next run\n prevRunEndX = prevGlyphX + prevGlyphObj.advanceWidth * fontSizeMult + letterSpacing * fontSize;\n });\n\n // Calculate width/height/baseline of each line (excluding trailing whitespace) and maximum block width\n let totalHeight = 0;\n lines.forEach(line => {\n let isTrailingWhitespace = true;\n for (let i = line.count; i--;) {\n const glyphInfo = line.glyphAt(i);\n // omit trailing whitespace from width calculation\n if (isTrailingWhitespace && !glyphInfo.glyphObj.isWhitespace) {\n line.width = glyphInfo.x + glyphInfo.width;\n if (line.width > maxLineWidth) {\n maxLineWidth = line.width;\n }\n isTrailingWhitespace = false;\n }\n // use the tallest line height, lowest baseline, and highest cap/ex\n let {lineHeight, capHeight, xHeight, baseline} = glyphInfo.fontData;\n if (lineHeight > line.lineHeight) line.lineHeight = lineHeight;\n const baselineDiff = baseline - line.baseline;\n if (baselineDiff < 0) { //shift all metrics down\n line.baseline += baselineDiff;\n line.cap += baselineDiff;\n line.ex += baselineDiff;\n }\n // compare cap/ex based on new lowest baseline\n line.cap = Math.max(line.cap, line.baseline + capHeight);\n line.ex = Math.max(line.ex, line.baseline + xHeight);\n }\n line.baseline -= totalHeight;\n line.cap -= totalHeight;\n line.ex -= totalHeight;\n totalHeight += line.lineHeight;\n });\n\n // Find overall position adjustments for anchoring\n let anchorXOffset = 0;\n let anchorYOffset = 0;\n if (anchorX) {\n if (typeof anchorX === 'number') {\n anchorXOffset = -anchorX;\n }\n else if (typeof anchorX === 'string') {\n anchorXOffset = -maxLineWidth * (\n anchorX === 'left' ? 0 :\n anchorX === 'center' ? 0.5 :\n anchorX === 'right' ? 1 :\n parsePercent(anchorX)\n );\n }\n }\n if (anchorY) {\n if (typeof anchorY === 'number') {\n anchorYOffset = -anchorY;\n }\n else if (typeof anchorY === 'string') {\n anchorYOffset = anchorY === 'top' ? 0 :\n anchorY === 'top-baseline' ? -lines[0].baseline :\n anchorY === 'top-cap' ? -lines[0].cap :\n anchorY === 'top-ex' ? -lines[0].ex :\n anchorY === 'middle' ? totalHeight / 2 :\n anchorY === 'bottom' ? totalHeight :\n anchorY === 'bottom-baseline' ? -lines[lines.length - 1].baseline :\n parsePercent(anchorY) * totalHeight;\n }\n }\n\n if (!metricsOnly) {\n // Resolve bidi levels\n const bidiLevelsResult = bidi.getEmbeddingLevels(text, direction);\n\n // Process each line, applying alignment offsets, adding each glyph to the atlas, and\n // collecting all renderable glyphs into a single collection.\n glyphIds = new Uint16Array(renderableGlyphCount);\n glyphFontIndices = new Uint8Array(renderableGlyphCount);\n glyphPositions = new Float32Array(renderableGlyphCount * 2);\n glyphData = {};\n visibleBounds = [INF, INF, -INF, -INF];\n chunkedBounds = [];\n if (includeCaretPositions) {\n caretPositions = new Float32Array(text.length * 4);\n }\n if (colorRanges) {\n glyphColors = new Uint8Array(renderableGlyphCount * 3);\n }\n let renderableGlyphIndex = 0;\n let prevCharIndex = -1;\n let colorCharIndex = -1;\n let chunk;\n let currentColor;\n lines.forEach((line, lineIndex) => {\n let {count:lineGlyphCount, width:lineWidth} = line;\n\n // Ignore empty lines\n if (lineGlyphCount > 0) {\n // Count trailing whitespaces, we want to ignore these for certain things\n let trailingWhitespaceCount = 0;\n for (let i = lineGlyphCount; i-- && line.glyphAt(i).glyphObj.isWhitespace;) {\n trailingWhitespaceCount++;\n }\n\n // Apply horizontal alignment adjustments\n let lineXOffset = 0;\n let justifyAdjust = 0;\n if (textAlign === 'center') {\n lineXOffset = (maxLineWidth - lineWidth) / 2;\n } else if (textAlign === 'right') {\n lineXOffset = maxLineWidth - lineWidth;\n } else if (textAlign === 'justify' && line.isSoftWrapped) {\n // count non-trailing whitespace characters, and we'll adjust the offsets per character in the next loop\n let whitespaceCount = 0;\n for (let i = lineGlyphCount - trailingWhitespaceCount; i--;) {\n if (line.glyphAt(i).glyphObj.isWhitespace) {\n whitespaceCount++;\n }\n }\n justifyAdjust = (maxLineWidth - lineWidth) / whitespaceCount;\n }\n if (justifyAdjust || lineXOffset) {\n let justifyOffset = 0;\n for (let i = 0; i < lineGlyphCount; i++) {\n let glyphInfo = line.glyphAt(i);\n const glyphObj = glyphInfo.glyphObj;\n glyphInfo.x += lineXOffset + justifyOffset;\n // Expand non-trailing whitespaces for justify alignment\n if (justifyAdjust !== 0 && glyphObj.isWhitespace && i < lineGlyphCount - trailingWhitespaceCount) {\n justifyOffset += justifyAdjust;\n glyphInfo.width += justifyAdjust;\n }\n }\n }\n\n // Perform bidi range flipping\n const flips = bidi.getReorderSegments(\n text, bidiLevelsResult, line.glyphAt(0).charIndex, line.glyphAt(line.count - 1).charIndex\n );\n for (let fi = 0; fi < flips.length; fi++) {\n const [start, end] = flips[fi];\n // Map start/end string indices to indices in the line\n let left = Infinity, right = -Infinity;\n for (let i = 0; i < lineGlyphCount; i++) {\n if (line.glyphAt(i).charIndex >= start) { // gte to handle removed characters\n let startInLine = i, endInLine = i;\n for (; endInLine < lineGlyphCount; endInLine++) {\n let info = line.glyphAt(endInLine);\n if (info.charIndex > end) {\n break\n }\n if (endInLine < lineGlyphCount - trailingWhitespaceCount) { //don't include trailing ws in flip width\n left = Math.min(left, info.x);\n right = Math.max(right, info.x + info.width);\n }\n }\n for (let j = startInLine; j < endInLine; j++) {\n const glyphInfo = line.glyphAt(j);\n glyphInfo.x = right - (glyphInfo.x + glyphInfo.width - left);\n }\n break\n }\n }\n }\n\n // Assemble final data arrays\n let glyphObj;\n const setGlyphObj = g => glyphObj = g;\n for (let i = 0; i < lineGlyphCount; i++) {\n const glyphInfo = line.glyphAt(i);\n glyphObj = glyphInfo.glyphObj;\n const glyphId = glyphObj.index;\n\n // Replace mirrored characters in rtl\n const rtl = bidiLevelsResult.levels[glyphInfo.charIndex] & 1; //odd level means rtl\n if (rtl) {\n const mirrored = bidi.getMirroredCharacter(text[glyphInfo.charIndex]);\n if (mirrored) {\n glyphInfo.fontData.fontObj.forEachGlyph(mirrored, 0, 0, setGlyphObj);\n }\n }\n\n // Add caret positions\n if (includeCaretPositions) {\n const {charIndex, fontData} = glyphInfo;\n const caretLeft = glyphInfo.x + anchorXOffset;\n const caretRight = glyphInfo.x + glyphInfo.width + anchorXOffset;\n caretPositions[charIndex * 4] = rtl ? caretRight : caretLeft; //start edge x\n caretPositions[charIndex * 4 + 1] = rtl ? caretLeft : caretRight; //end edge x\n caretPositions[charIndex * 4 + 2] = line.baseline + fontData.caretBottom + anchorYOffset; //common bottom y\n caretPositions[charIndex * 4 + 3] = line.baseline + fontData.caretTop + anchorYOffset; //common top y\n\n // If we skipped any chars from the previous glyph (due to ligature subs), fill in caret\n // positions for those missing char indices; currently this uses a best-guess by dividing\n // the ligature's width evenly. In the future we may try to use the font's LigatureCaretList\n // table to get better interior caret positions.\n const ligCount = charIndex - prevCharIndex;\n if (ligCount > 1) {\n fillLigatureCaretPositions(caretPositions, prevCharIndex, ligCount);\n }\n prevCharIndex = charIndex;\n }\n\n // Track current color range\n if (colorRanges) {\n const {charIndex} = glyphInfo;\n while(charIndex > colorCharIndex) {\n colorCharIndex++;\n if (colorRanges.hasOwnProperty(colorCharIndex)) {\n currentColor = colorRanges[colorCharIndex];\n }\n }\n }\n\n // Get atlas data for renderable glyphs\n if (!glyphObj.isWhitespace && !glyphObj.isEmpty) {\n const idx = renderableGlyphIndex++;\n const {fontSizeMult, src: fontSrc, index: fontIndex} = glyphInfo.fontData;\n\n // Add this glyph's path data\n const fontGlyphData = glyphData[fontSrc] || (glyphData[fontSrc] = {});\n if (!fontGlyphData[glyphId]) {\n fontGlyphData[glyphId] = {\n path: glyphObj.path,\n pathBounds: [glyphObj.xMin, glyphObj.yMin, glyphObj.xMax, glyphObj.yMax]\n };\n }\n\n // Determine final glyph position and add to glyphPositions array\n const glyphX = glyphInfo.x + anchorXOffset;\n const glyphY = glyphInfo.y + line.baseline + anchorYOffset;\n glyphPositions[idx * 2] = glyphX;\n glyphPositions[idx * 2 + 1] = glyphY;\n\n // Track total visible bounds\n const visX0 = glyphX + glyphObj.xMin * fontSizeMult;\n const visY0 = glyphY + glyphObj.yMin * fontSizeMult;\n const visX1 = glyphX + glyphObj.xMax * fontSizeMult;\n const visY1 = glyphY + glyphObj.yMax * fontSizeMult;\n if (visX0 < visibleBounds[0]) visibleBounds[0] = visX0;\n if (visY0 < visibleBounds[1]) visibleBounds[1] = visY0;\n if (visX1 > visibleBounds[2]) visibleBounds[2] = visX1;\n if (visY1 > visibleBounds[3]) visibleBounds[3] = visY1;\n\n // Track bounding rects for each chunk of N glyphs\n if (idx % chunkedBoundsSize === 0) {\n chunk = {start: idx, end: idx, rect: [INF, INF, -INF, -INF]};\n chunkedBounds.push(chunk);\n }\n chunk.end++;\n const chunkRect = chunk.rect;\n if (visX0 < chunkRect[0]) chunkRect[0] = visX0;\n if (visY0 < chunkRect[1]) chunkRect[1] = visY0;\n if (visX1 > chunkRect[2]) chunkRect[2] = visX1;\n if (visY1 > chunkRect[3]) chunkRect[3] = visY1;\n\n // Add to glyph ids and font indices arrays\n glyphIds[idx] = glyphId;\n glyphFontIndices[idx] = fontIndex;\n\n // Add colors\n if (colorRanges) {\n const start = idx * 3;\n glyphColors[start] = currentColor >> 16 & 255;\n glyphColors[start + 1] = currentColor >> 8 & 255;\n glyphColors[start + 2] = currentColor & 255;\n }\n }\n }\n }\n });\n\n // Fill in remaining caret positions in case the final character was a ligature\n if (caretPositions) {\n const ligCount = text.length - prevCharIndex;\n if (ligCount > 1) {\n fillLigatureCaretPositions(caretPositions, prevCharIndex, ligCount);\n }\n }\n }\n\n // Assemble final data about each font used\n const fontData = [];\n metricsByFont.forEach(({index, src, unitsPerEm, ascender, descender, lineHeight, capHeight, xHeight}) => {\n fontData[index] = {src, unitsPerEm, ascender, descender, lineHeight, capHeight, xHeight};\n });\n\n // Timing stats\n timings.typesetting = now() - typesetStart;\n\n callback({\n glyphIds, //id for each glyph, specific to that glyph's font\n glyphFontIndices, //index into fontData for each glyph\n glyphPositions, //x,y of each glyph's origin in layout\n glyphData, //dict holding data about each glyph appearing in the text\n fontData, //data about each font used in the text\n caretPositions, //startX,endX,bottomY caret positions for each char\n // caretHeight, //height of cursor from bottom to top - todo per glyph?\n glyphColors, //color for each glyph, if color ranges supplied\n chunkedBounds, //total rects per (n=chunkedBoundsSize) consecutive glyphs\n fontSize, //calculated em height\n topBaseline: anchorYOffset + lines[0].baseline, //y coordinate of the top line's baseline\n blockBounds: [ //bounds for the whole block of text, including vertical padding for lineHeight\n anchorXOffset,\n anchorYOffset - totalHeight,\n anchorXOffset + maxLineWidth,\n anchorYOffset\n ],\n visibleBounds, //total bounds of visible text paths, may be larger or smaller than blockBounds\n timings\n });\n });\n }\n\n\n /**\n * For a given text string and font parameters, determine the resulting block dimensions\n * after wrapping for the given maxWidth.\n * @param args\n * @param callback\n */\n function measure(args, callback) {\n typeset({...args, metricsOnly: true}, (result) => {\n const [x0, y0, x1, y1] = result.blockBounds;\n callback({\n width: x1 - x0,\n height: y1 - y0\n });\n });\n }\n\n function parsePercent(str) {\n let match = str.match(/^([\\d.]+)%$/);\n let pct = match ? parseFloat(match[1]) : NaN;\n return isNaN(pct) ? 0 : pct / 100\n }\n\n function fillLigatureCaretPositions(caretPositions, ligStartIndex, ligCount) {\n const ligStartX = caretPositions[ligStartIndex * 4];\n const ligEndX = caretPositions[ligStartIndex * 4 + 1];\n const ligBottom = caretPositions[ligStartIndex * 4 + 2];\n const ligTop = caretPositions[ligStartIndex * 4 + 3];\n const guessedAdvanceX = (ligEndX - ligStartX) / ligCount;\n for (let i = 0; i < ligCount; i++) {\n const startIndex = (ligStartIndex + i) * 4;\n caretPositions[startIndex] = ligStartX + guessedAdvanceX * i;\n caretPositions[startIndex + 1] = ligStartX + guessedAdvanceX * (i + 1);\n caretPositions[startIndex + 2] = ligBottom;\n caretPositions[startIndex + 3] = ligTop;\n }\n }\n\n function now() {\n return (self.performance || Date).now()\n }\n\n // Array-backed structure for a single line's glyphs data\n function TextLine() {\n this.data = [];\n }\n const textLineProps = ['glyphObj', 'x', 'y', 'width', 'charIndex', 'fontData'];\n TextLine.prototype = {\n width: 0,\n lineHeight: 0,\n baseline: 0,\n cap: 0,\n ex: 0,\n isSoftWrapped: false,\n get count() {\n return Math.ceil(this.data.length / textLineProps.length)\n },\n glyphAt(i) {\n let fly = TextLine.flyweight;\n fly.data = this.data;\n fly.index = i;\n return fly\n },\n splitAt(i) {\n let newLine = new TextLine();\n newLine.data = this.data.splice(i * textLineProps.length);\n return newLine\n }\n };\n TextLine.flyweight = textLineProps.reduce((obj, prop, i, all) => {\n Object.defineProperty(obj, prop, {\n get() {\n return this.data[this.index * textLineProps.length + i]\n },\n set(val) {\n this.data[this.index * textLineProps.length + i] = val;\n }\n });\n return obj\n }, {data: null, index: 0});\n\n\n return {\n typeset,\n measure,\n }\n}\n\nconst now = () => (self.performance || Date).now();\n\nconst mainThreadGenerator = /*#__PURE__*/ createSDFGenerator();\n\nlet warned;\n\n/**\n * Generate an SDF texture image for a single glyph path, placing the result into a webgl canvas at a\n * given location and channel. Utilizes the webgl-sdf-generator external package for GPU-accelerated SDF\n * generation when supported.\n */\nfunction generateSDF(width, height, path, viewBox, distance, exponent, canvas, x, y, channel, useWebGL = true) {\n // Allow opt-out\n if (!useWebGL) {\n return generateSDF_JS_Worker(width, height, path, viewBox, distance, exponent, canvas, x, y, channel)\n }\n\n // Attempt GPU-accelerated generation first\n return generateSDF_GL(width, height, path, viewBox, distance, exponent, canvas, x, y, channel).then(\n null,\n err => {\n // WebGL failed either due to a hard error or unexpected results; fall back to JS in workers\n if (!warned) {\n console.warn(`WebGL SDF generation failed, falling back to JS`, err);\n warned = true;\n }\n return generateSDF_JS_Worker(width, height, path, viewBox, distance, exponent, canvas, x, y, channel)\n }\n )\n}\n\nconst queue = [];\nconst chunkTimeBudget = 5; // ms\nlet timer = 0;\n\nfunction nextChunk() {\n const start = now();\n while (queue.length && now() - start < chunkTimeBudget) {\n queue.shift()();\n }\n timer = queue.length ? setTimeout(nextChunk, 0) : 0;\n}\n\n/**\n * WebGL-based implementation executed on the main thread. Requests are executed in time-bounded\n * macrotask chunks to allow render frames to execute in between.\n */\nconst generateSDF_GL = (...args) => {\n return new Promise((resolve, reject) => {\n queue.push(() => {\n const start = now();\n try {\n mainThreadGenerator.webgl.generateIntoCanvas(...args);\n resolve({ timing: now() - start });\n } catch (err) {\n reject(err);\n }\n });\n if (!timer) {\n timer = setTimeout(nextChunk, 0);\n }\n })\n};\n\nconst threadCount = 4; // how many workers to spawn\nconst idleTimeout = 2000; // workers will be terminated after being idle this many milliseconds\nconst threads = {};\nlet callNum = 0;\n\n/**\n * Fallback JS-based implementation, fanned out to a number of worker threads for parallelism\n */\nfunction generateSDF_JS_Worker(width, height, path, viewBox, distance, exponent, canvas, x, y, channel) {\n const workerId = 'TroikaTextSDFGenerator_JS_' + ((callNum++) % threadCount);\n let thread = threads[workerId];\n if (!thread) {\n thread = threads[workerId] = {\n workerModule: defineWorkerModule({\n name: workerId,\n workerId,\n dependencies: [\n createSDFGenerator,\n now\n ],\n init(_createSDFGenerator, now) {\n const generate = _createSDFGenerator().javascript.generate;\n return function (...args) {\n const start = now();\n const textureData = generate(...args);\n return {\n textureData,\n timing: now() - start\n }\n }\n },\n getTransferables(result) {\n return [result.textureData.buffer]\n }\n }),\n requests: 0,\n idleTimer: null\n };\n }\n\n thread.requests++;\n clearTimeout(thread.idleTimer);\n return thread.workerModule(width, height, path, viewBox, distance, exponent)\n .then(({ textureData, timing }) => {\n // copy result data into the canvas\n const start = now();\n // expand single-channel data into rgba\n const imageData = new Uint8Array(textureData.length * 4);\n for (let i = 0; i < textureData.length; i++) {\n imageData[i * 4 + channel] = textureData[i];\n }\n mainThreadGenerator.webglUtils.renderImageData(canvas, imageData, x, y, width, height, 1 << (3 - channel));\n timing += now() - start;\n\n // clean up workers after a while\n if (--thread.requests === 0) {\n thread.idleTimer = setTimeout(() => { terminateWorker(workerId); }, idleTimeout);\n }\n return { timing }\n })\n}\n\nfunction warmUpSDFCanvas(canvas) {\n if (!canvas._warm) {\n mainThreadGenerator.webgl.isSupported(canvas);\n canvas._warm = true;\n }\n}\n\nconst resizeWebGLCanvasWithoutClearing = mainThreadGenerator.webglUtils.resizeWebGLCanvasWithoutClearing;\n\nconst CONFIG = {\n defaultFontURL: null,\n unicodeFontsURL: null,\n sdfGlyphSize: 64,\n sdfMargin: 1 / 16,\n sdfExponent: 9,\n textureWidth: 2048,\n useWorker: true,\n};\nconst tempColor = /*#__PURE__*/new Color();\nlet hasRequested = false;\n\nfunction now$1() {\n return (self.performance || Date).now()\n}\n\n/**\n * Customizes the text builder configuration. This must be called prior to the first font processing\n * request, and applies to all fonts.\n *\n * @param {String} config.defaultFontURL - The URL of the default font to use for text processing\n * requests, in case none is specified or the specifiede font fails to load or parse.\n * Defaults to \"Roboto Regular\" from Google Fonts.\n * @param {String} config.unicodeFontsURL - A custom location for the fallback unicode-font-resolver\n * data and font files, if you don't want to use the default CDN. See\n * https://github.com/lojjic/unicode-font-resolver for details. It can also be\n * configured per text instance, but this lets you do it once globally.\n * @param {Number} config.sdfGlyphSize - The default size of each glyph's SDF (signed distance field)\n * texture used for rendering. Must be a power-of-two number, and applies to all fonts,\n * but note that this can also be overridden per call to `getTextRenderInfo()`.\n * Larger sizes can improve the quality of glyph rendering by increasing the sharpness\n * of corners and preventing loss of very thin lines, at the expense of memory. Defaults\n * to 64 which is generally a good balance of size and quality.\n * @param {Number} config.sdfExponent - The exponent used when encoding the SDF values. A higher exponent\n * shifts the encoded 8-bit values to achieve higher precision/accuracy at texels nearer\n * the glyph's path, with lower precision further away. Defaults to 9.\n * @param {Number} config.sdfMargin - How much space to reserve in the SDF as margin outside the glyph's\n * path, as a percentage of the SDF width. A larger margin increases the quality of\n * extruded glyph outlines, but decreases the precision available for the glyph itself.\n * Defaults to 1/16th of the glyph size.\n * @param {Number} config.textureWidth - The width of the SDF texture; must be a power of 2. Defaults to\n * 2048 which is a safe maximum texture dimension according to the stats at\n * https://webglstats.com/webgl/parameter/MAX_TEXTURE_SIZE and should allow for a\n * reasonably large number of glyphs (default glyph size of 64^2 and safe texture size of\n * 2048^2, times 4 channels, allows for 4096 glyphs.) This can be increased if you need to\n * increase the glyph size and/or have an extraordinary number of glyphs.\n * @param {Boolean} config.useWorker - Whether to run typesetting in a web worker. Defaults to true.\n */\nfunction configureTextBuilder(config) {\n if (hasRequested) {\n console.warn('configureTextBuilder called after first font request; will be ignored.');\n } else {\n assign(CONFIG, config);\n }\n}\n\n/**\n * Repository for all font SDF atlas textures and their glyph mappings. There is a separate atlas for\n * each sdfGlyphSize. Each atlas has a single Texture that holds all glyphs for all fonts.\n *\n * {\n * [sdfGlyphSize]: {\n * glyphCount: number,\n * sdfGlyphSize: number,\n * sdfTexture: Texture,\n * sdfCanvas: HTMLCanvasElement,\n * contextLost: boolean,\n * glyphsByFont: Map<fontURL, Map<glyphID, {path, atlasIndex, sdfViewBox}>>\n * }\n * }\n */\nconst atlases = Object.create(null);\n\n/**\n * @typedef {object} TroikaTextRenderInfo - Format of the result from `getTextRenderInfo`.\n * @property {TypesetParams} parameters - The normalized input arguments to the render call.\n * @property {Texture} sdfTexture - The SDF atlas texture.\n * @property {number} sdfGlyphSize - The size of each glyph's SDF; see `configureTextBuilder`.\n * @property {number} sdfExponent - The exponent used in encoding the SDF's values; see `configureTextBuilder`.\n * @property {Float32Array} glyphBounds - List of [minX, minY, maxX, maxY] quad bounds for each glyph.\n * @property {Float32Array} glyphAtlasIndices - List holding each glyph's index in the SDF atlas.\n * @property {Uint8Array} [glyphColors] - List holding each glyph's [r, g, b] color, if `colorRanges` was supplied.\n * @property {Float32Array} [caretPositions] - A list of caret positions for all characters in the string; each is\n * four elements: the starting X, the ending X, the bottom Y, and the top Y for the caret.\n * @property {number} [caretHeight] - An appropriate height for all selection carets.\n * @property {number} ascender - The font's ascender metric.\n * @property {number} descender - The font's descender metric.\n * @property {number} capHeight - The font's cap height metric, based on the height of Latin capital letters.\n * @property {number} xHeight - The font's x height metric, based on the height of Latin lowercase letters.\n * @property {number} lineHeight - The final computed lineHeight measurement.\n * @property {number} topBaseline - The y position of the top line's baseline.\n * @property {Array<number>} blockBounds - The total [minX, minY, maxX, maxY] rect of the whole text block;\n * this can include extra vertical space beyond the visible glyphs due to lineHeight, and is\n * equivalent to the dimensions of a block-level text element in CSS.\n * @property {Array<number>} visibleBounds - The total [minX, minY, maxX, maxY] rect of the whole text block;\n * unlike `blockBounds` this is tightly wrapped to the visible glyph paths.\n * @property {Array<object>} chunkedBounds - List of bounding rects for each consecutive set of N glyphs,\n * in the format `{start:N, end:N, rect:[minX, minY, maxX, maxY]}`.\n * @property {object} timings - Timing info for various parts of the rendering logic including SDF\n * generation, typesetting, etc.\n * @frozen\n */\n\n/**\n * @callback getTextRenderInfo~callback\n * @param {TroikaTextRenderInfo} textRenderInfo\n */\n\n/**\n * Main entry point for requesting the data needed to render a text string with given font parameters.\n * This is an asynchronous call, performing most of the logic in a web worker thread.\n * @param {TypesetParams} args\n * @param {getTextRenderInfo~callback} callback\n */\nfunction getTextRenderInfo(args, callback) {\n hasRequested = true;\n args = assign({}, args);\n const totalStart = now$1();\n\n // Convert relative URL to absolute so it can be resolved in the worker, and add fallbacks.\n // In the future we'll allow args.font to be a list with unicode ranges too.\n const { defaultFontURL } = CONFIG;\n const fonts = [];\n if (defaultFontURL) {\n fonts.push({label: 'default', src: toAbsoluteURL(defaultFontURL)});\n }\n if (args.font) {\n fonts.push({label: 'user', src: toAbsoluteURL(args.font)});\n }\n args.font = fonts;\n\n // Normalize text to a string\n args.text = '' + args.text;\n\n args.sdfGlyphSize = args.sdfGlyphSize || CONFIG.sdfGlyphSize;\n args.unicodeFontsURL = args.unicodeFontsURL || CONFIG.unicodeFontsURL;\n\n // Normalize colors\n if (args.colorRanges != null) {\n let colors = {};\n for (let key in args.colorRanges) {\n if (args.colorRanges.hasOwnProperty(key)) {\n let val = args.colorRanges[key];\n if (typeof val !== 'number') {\n val = tempColor.set(val).getHex();\n }\n colors[key] = val;\n }\n }\n args.colorRanges = colors;\n }\n\n Object.freeze(args);\n\n // Init the atlas if needed\n const {textureWidth, sdfExponent} = CONFIG;\n const {sdfGlyphSize} = args;\n const glyphsPerRow = (textureWidth / sdfGlyphSize * 4);\n let atlas = atlases[sdfGlyphSize];\n if (!atlas) {\n const canvas = document.createElement('canvas');\n canvas.width = textureWidth;\n canvas.height = sdfGlyphSize * 256 / glyphsPerRow; // start tall enough to fit 256 glyphs\n atlas = atlases[sdfGlyphSize] = {\n glyphCount: 0,\n sdfGlyphSize,\n sdfCanvas: canvas,\n sdfTexture: new Texture(\n canvas,\n undefined,\n undefined,\n undefined,\n LinearFilter,\n LinearFilter\n ),\n contextLost: false,\n glyphsByFont: new Map()\n };\n atlas.sdfTexture.generateMipmaps = false;\n initContextLossHandling(atlas);\n }\n\n const {sdfTexture, sdfCanvas} = atlas;\n\n // Issue request to the typesetting engine in the worker\n const typeset = CONFIG.useWorker ? typesetInWorker : typesetOnMainThread;\n typeset(args).then(result => {\n const {glyphIds, glyphFontIndices, fontData, glyphPositions, fontSize, timings} = result;\n const neededSDFs = [];\n const glyphBounds = new Float32Array(glyphIds.length * 4);\n let boundsIdx = 0;\n let positionsIdx = 0;\n const quadsStart = now$1();\n\n const fontGlyphMaps = fontData.map(font => {\n let map = atlas.glyphsByFont.get(font.src);\n if (!map) {\n atlas.glyphsByFont.set(font.src, map = new Map());\n }\n return map\n });\n\n glyphIds.forEach((glyphId, i) => {\n const fontIndex = glyphFontIndices[i];\n const {src: fontSrc, unitsPerEm} = fontData[fontIndex];\n let glyphInfo = fontGlyphMaps[fontIndex].get(glyphId);\n\n // If this is a glyphId not seen before, add it to the atlas\n if (!glyphInfo) {\n const {path, pathBounds} = result.glyphData[fontSrc][glyphId];\n\n // Margin around path edges in SDF, based on a percentage of the glyph's max dimension.\n // Note we add an extra 0.5 px over the configured value because the outer 0.5 doesn't contain\n // useful interpolated values and will be ignored anyway.\n const fontUnitsMargin = Math.max(pathBounds[2] - pathBounds[0], pathBounds[3] - pathBounds[1])\n / sdfGlyphSize * (CONFIG.sdfMargin * sdfGlyphSize + 0.5);\n\n const atlasIndex = atlas.glyphCount++;\n const sdfViewBox = [\n pathBounds[0] - fontUnitsMargin,\n pathBounds[1] - fontUnitsMargin,\n pathBounds[2] + fontUnitsMargin,\n pathBounds[3] + fontUnitsMargin,\n ];\n fontGlyphMaps[fontIndex].set(glyphId, (glyphInfo = { path, atlasIndex, sdfViewBox }));\n\n // Collect those that need SDF generation\n neededSDFs.push(glyphInfo);\n }\n\n // Calculate bounds for renderable quads\n // TODO can we get this back off the main thread?\n const {sdfViewBox} = glyphInfo;\n const posX = glyphPositions[positionsIdx++];\n const posY = glyphPositions[positionsIdx++];\n const fontSizeMult = fontSize / unitsPerEm;\n glyphBounds[boundsIdx++] = posX + sdfViewBox[0] * fontSizeMult;\n glyphBounds[boundsIdx++] = posY + sdfViewBox[1] * fontSizeMult;\n glyphBounds[boundsIdx++] = posX + sdfViewBox[2] * fontSizeMult;\n glyphBounds[boundsIdx++] = posY + sdfViewBox[3] * fontSizeMult;\n\n // Convert glyphId to SDF index for the shader\n glyphIds[i] = glyphInfo.atlasIndex;\n });\n timings.quads = (timings.quads || 0) + (now$1() - quadsStart);\n\n const sdfStart = now$1();\n timings.sdf = {};\n\n // Grow the texture height by power of 2 if needed\n const currentHeight = sdfCanvas.height;\n const neededRows = Math.ceil(atlas.glyphCount / glyphsPerRow);\n const neededHeight = Math.pow(2, Math.ceil(Math.log2(neededRows * sdfGlyphSize)));\n if (neededHeight > currentHeight) {\n // Since resizing the canvas clears its render buffer, it needs special handling to copy the old contents over\n console.info(`Increasing SDF texture size ${currentHeight}->${neededHeight}`);\n resizeWebGLCanvasWithoutClearing(sdfCanvas, textureWidth, neededHeight);\n // As of Three r136 textures cannot be resized once they're allocated on the GPU, we must dispose to reallocate it\n sdfTexture.dispose();\n }\n\n Promise.all(neededSDFs.map(glyphInfo =>\n generateGlyphSDF(glyphInfo, atlas, args.gpuAccelerateSDF).then(({timing}) => {\n timings.sdf[glyphInfo.atlasIndex] = timing;\n })\n )).then(() => {\n if (neededSDFs.length && !atlas.contextLost) {\n safariPre15Workaround(atlas);\n sdfTexture.needsUpdate = true;\n }\n timings.sdfTotal = now$1() - sdfStart;\n timings.total = now$1() - totalStart;\n // console.log(`SDF - ${timings.sdfTotal}, Total - ${timings.total - timings.fontLoad}`)\n\n // Invoke callback with the text layout arrays and updated texture\n callback(Object.freeze({\n parameters: args,\n sdfTexture,\n sdfGlyphSize,\n sdfExponent,\n glyphBounds,\n glyphAtlasIndices: glyphIds,\n glyphColors: result.glyphColors,\n caretPositions: result.caretPositions,\n chunkedBounds: result.chunkedBounds,\n ascender: result.ascender,\n descender: result.descender,\n lineHeight: result.lineHeight,\n capHeight: result.capHeight,\n xHeight: result.xHeight,\n topBaseline: result.topBaseline,\n blockBounds: result.blockBounds,\n visibleBounds: result.visibleBounds,\n timings: result.timings,\n }));\n });\n });\n\n // While the typesetting request is being handled, go ahead and make sure the atlas canvas context is\n // \"warmed up\"; the first request will be the longest due to shader program compilation so this gets\n // a head start on that process before SDFs actually start getting processed.\n Promise.resolve().then(() => {\n if (!atlas.contextLost) {\n warmUpSDFCanvas(sdfCanvas);\n }\n });\n}\n\nfunction generateGlyphSDF({path, atlasIndex, sdfViewBox}, {sdfGlyphSize, sdfCanvas, contextLost}, useGPU) {\n if (contextLost) {\n // If the context is lost there's nothing we can do, just quit silently and let it\n // get regenerated when the context is restored\n return Promise.resolve({timing: -1})\n }\n const {textureWidth, sdfExponent} = CONFIG;\n const maxDist = Math.max(sdfViewBox[2] - sdfViewBox[0], sdfViewBox[3] - sdfViewBox[1]);\n const squareIndex = Math.floor(atlasIndex / 4);\n const x = squareIndex % (textureWidth / sdfGlyphSize) * sdfGlyphSize;\n const y = Math.floor(squareIndex / (textureWidth / sdfGlyphSize)) * sdfGlyphSize;\n const channel = atlasIndex % 4;\n return generateSDF(sdfGlyphSize, sdfGlyphSize, path, sdfViewBox, maxDist, sdfExponent, sdfCanvas, x, y, channel, useGPU)\n}\n\nfunction initContextLossHandling(atlas) {\n const canvas = atlas.sdfCanvas;\n\n /*\n // Begin context loss simulation\n if (!window.WebGLDebugUtils) {\n let script = document.getElementById('WebGLDebugUtilsScript')\n if (!script) {\n script = document.createElement('script')\n script.id = 'WebGLDebugUtils'\n document.head.appendChild(script)\n script.src = 'https://cdn.jsdelivr.net/gh/KhronosGroup/WebGLDeveloperTools@b42e702/src/debug/webgl-debug.js'\n }\n script.addEventListener('load', () => {\n initContextLossHandling(atlas)\n })\n return\n }\n window.WebGLDebugUtils.makeLostContextSimulatingCanvas(canvas)\n canvas.loseContextInNCalls(500)\n canvas.addEventListener('webglcontextrestored', (event) => {\n canvas.loseContextInNCalls(5000)\n })\n // End context loss simulation\n */\n\n canvas.addEventListener('webglcontextlost', (event) => {\n console.log('Context Lost', event);\n event.preventDefault();\n atlas.contextLost = true;\n });\n canvas.addEventListener('webglcontextrestored', (event) => {\n console.log('Context Restored', event);\n atlas.contextLost = false;\n // Regenerate all glyphs into the restored canvas:\n const promises = [];\n atlas.glyphsByFont.forEach(glyphMap => {\n glyphMap.forEach(glyph => {\n promises.push(generateGlyphSDF(glyph, atlas, true));\n });\n });\n Promise.all(promises).then(() => {\n safariPre15Workaround(atlas);\n atlas.sdfTexture.needsUpdate = true;\n });\n });\n}\n\n/**\n * Preload a given font and optionally pre-generate glyph SDFs for one or more character sequences.\n * This can be useful to avoid long pauses when first showing text in a scene, by preloading the\n * needed fonts and glyphs up front along with other assets.\n *\n * @param {object} options\n * @param {string} options.font - URL of the font file to preload. If not given, the default font will\n * be loaded.\n * @param {string|string[]} options.characters - One or more character sequences for which to pre-\n * generate glyph SDFs. Note that this will honor ligature substitution, so you may need\n * to specify ligature sequences in addition to their individual characters to get all\n * possible glyphs, e.g. `[\"t\", \"h\", \"th\"]` to get the \"t\" and \"h\" glyphs plus the \"th\" ligature.\n * @param {number} options.sdfGlyphSize - The size at which to prerender the SDF textures for the\n * specified `characters`.\n * @param {function} callback - A function that will be called when the preloading is complete.\n */\nfunction preloadFont({font, characters, sdfGlyphSize}, callback) {\n let text = Array.isArray(characters) ? characters.join('\\n') : '' + characters;\n getTextRenderInfo({ font, sdfGlyphSize, text }, callback);\n}\n\n\n// Local assign impl so we don't have to import troika-core\nfunction assign(toObj, fromObj) {\n for (let key in fromObj) {\n if (fromObj.hasOwnProperty(key)) {\n toObj[key] = fromObj[key];\n }\n }\n return toObj\n}\n\n// Utility for making URLs absolute\nlet linkEl;\nfunction toAbsoluteURL(path) {\n if (!linkEl) {\n linkEl = typeof document === 'undefined' ? {} : document.createElement('a');\n }\n linkEl.href = path;\n return linkEl.href\n}\n\n/**\n * Safari < v15 seems unable to use the SDF webgl canvas as a texture. This applies a workaround\n * where it reads the pixels out of that canvas and uploads them as a data texture instead, at\n * a slight performance cost.\n */\nfunction safariPre15Workaround(atlas) {\n // Use createImageBitmap support as a proxy for Safari<15, all other mainstream browsers\n // have supported it for a long while so any false positives should be minimal.\n if (typeof createImageBitmap !== 'function') {\n console.info('Safari<15: applying SDF canvas workaround');\n const {sdfCanvas, sdfTexture} = atlas;\n const {width, height} = sdfCanvas;\n const gl = atlas.sdfCanvas.getContext('webgl');\n let pixels = sdfTexture.image.data;\n if (!pixels || pixels.length !== width * height * 4) {\n pixels = new Uint8Array(width * height * 4);\n sdfTexture.image = {width, height, data: pixels};\n sdfTexture.flipY = false;\n sdfTexture.isDataTexture = true;\n }\n gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\n }\n}\n\nconst typesetterWorkerModule = /*#__PURE__*/defineWorkerModule({\n name: 'Typesetter',\n dependencies: [\n createTypesetter,\n fontResolverWorkerModule,\n bidiFactory,\n ],\n init(createTypesetter, fontResolver, bidiFactory) {\n return createTypesetter(fontResolver, bidiFactory())\n }\n});\n\nconst typesetInWorker = /*#__PURE__*/defineWorkerModule({\n name: 'Typesetter',\n dependencies: [\n typesetterWorkerModule,\n ],\n init(typesetter) {\n return function(args) {\n return new Promise(resolve => {\n typesetter.typeset(args, resolve);\n })\n }\n },\n getTransferables(result) {\n // Mark array buffers as transferable to avoid cloning during postMessage\n const transferables = [];\n for (let p in result) {\n if (result[p] && result[p].buffer) {\n transferables.push(result[p].buffer);\n }\n }\n return transferables\n }\n});\n\nconst typesetOnMainThread = typesetInWorker.onMainThread;\n\nfunction dumpSDFTextures() {\n Object.keys(atlases).forEach(size => {\n const canvas = atlases[size].sdfCanvas;\n const {width, height} = canvas;\n console.log(\"%c.\", `\n background: url(${canvas.toDataURL()});\n background-size: ${width}px ${height}px;\n color: transparent;\n font-size: 0;\n line-height: ${height}px;\n padding-left: ${width}px;\n `);\n });\n}\n\nconst templateGeometries = {};\n\nfunction getTemplateGeometry(detail) {\n let geom = templateGeometries[detail];\n if (!geom) {\n geom = templateGeometries[detail] = new PlaneGeometry(1, 1, detail, detail).translate(0.5, 0.5, 0);\n }\n return geom\n}\n\nconst glyphBoundsAttrName = 'aTroikaGlyphBounds';\nconst glyphIndexAttrName = 'aTroikaGlyphIndex';\nconst glyphColorAttrName = 'aTroikaGlyphColor';\n\n/**\n@class GlyphsGeometry\n\nA specialized Geometry for rendering a set of text glyphs. Uses InstancedBufferGeometry to\nrender the glyphs using GPU instancing of a single quad, rather than constructing a whole\ngeometry with vertices, for much smaller attribute arraybuffers according to this math:\n\n Where N = number of glyphs...\n\n Instanced:\n - position: 4 * 3\n - index: 2 * 3\n - normal: 4 * 3\n - uv: 4 * 2\n - glyph x/y bounds: N * 4\n - glyph indices: N * 1\n = 5N + 38\n\n Non-instanced:\n - position: N * 4 * 3\n - index: N * 2 * 3\n - normal: N * 4 * 3\n - uv: N * 4 * 2\n - glyph indices: N * 1\n = 39N\n\nA downside of this is the rare-but-possible lack of the instanced arrays extension,\nwhich we could potentially work around with a fallback non-instanced implementation.\n\n*/\nclass GlyphsGeometry extends InstancedBufferGeometry {\n constructor() {\n super();\n\n this.detail = 1;\n this.curveRadius = 0;\n\n // Define groups for rendering text outline as a separate pass; these will only\n // be used when the `material` getter returns an array, i.e. outlineWidth > 0.\n this.groups = [\n {start: 0, count: Infinity, materialIndex: 0},\n {start: 0, count: Infinity, materialIndex: 1}\n ];\n\n // Preallocate empty bounding objects\n this.boundingSphere = new Sphere();\n this.boundingBox = new Box3();\n }\n\n computeBoundingSphere () {\n // No-op; we'll sync the boundingSphere proactively when needed.\n }\n\n computeBoundingBox() {\n // No-op; we'll sync the boundingBox proactively when needed.\n }\n\n set detail(detail) {\n if (detail !== this._detail) {\n this._detail = detail;\n if (typeof detail !== 'number' || detail < 1) {\n detail = 1;\n }\n let tpl = getTemplateGeometry(detail)\n ;['position', 'normal', 'uv'].forEach(attr => {\n this.attributes[attr] = tpl.attributes[attr].clone();\n });\n this.setIndex(tpl.getIndex().clone());\n }\n }\n get detail() {\n return this._detail\n }\n\n set curveRadius(r) {\n if (r !== this._curveRadius) {\n this._curveRadius = r;\n this._updateBounds();\n }\n }\n get curveRadius() {\n return this._curveRadius\n }\n\n /**\n * Update the geometry for a new set of glyphs.\n * @param {Float32Array} glyphBounds - An array holding the planar bounds for all glyphs\n * to be rendered, 4 entries for each glyph: x1,x2,y1,y1\n * @param {Float32Array} glyphAtlasIndices - An array holding the index of each glyph within\n * the SDF atlas texture.\n * @param {Array} blockBounds - An array holding the [minX, minY, maxX, maxY] across all glyphs\n * @param {Array} [chunkedBounds] - An array of objects describing bounds for each chunk of N\n * consecutive glyphs: `{start:N, end:N, rect:[minX, minY, maxX, maxY]}`. This can be\n * used with `applyClipRect` to choose an optimized `instanceCount`.\n * @param {Uint8Array} [glyphColors] - An array holding r,g,b values for each glyph.\n */\n updateGlyphs(glyphBounds, glyphAtlasIndices, blockBounds, chunkedBounds, glyphColors) {\n // Update the instance attributes\n this.updateAttributeData(glyphBoundsAttrName, glyphBounds, 4);\n this.updateAttributeData(glyphIndexAttrName, glyphAtlasIndices, 1);\n this.updateAttributeData(glyphColorAttrName, glyphColors, 3);\n this._blockBounds = blockBounds;\n this._chunkedBounds = chunkedBounds;\n this.instanceCount = glyphAtlasIndices.length;\n this._updateBounds();\n }\n\n _updateBounds() {\n const bounds = this._blockBounds;\n if (bounds) {\n const { curveRadius, boundingBox: bbox } = this;\n if (curveRadius) {\n const { PI, floor, min, max, sin, cos } = Math;\n const halfPi = PI / 2;\n const twoPi = PI * 2;\n const absR = Math.abs(curveRadius);\n const leftAngle = bounds[0] / absR;\n const rightAngle = bounds[2] / absR;\n const minX = floor((leftAngle + halfPi) / twoPi) !== floor((rightAngle + halfPi) / twoPi)\n ? -absR : min(sin(leftAngle) * absR, sin(rightAngle) * absR);\n const maxX = floor((leftAngle - halfPi) / twoPi) !== floor((rightAngle - halfPi) / twoPi)\n ? absR : max(sin(leftAngle) * absR, sin(rightAngle) * absR);\n const maxZ = floor((leftAngle + PI) / twoPi) !== floor((rightAngle + PI) / twoPi)\n ? absR * 2 : max(absR - cos(leftAngle) * absR, absR - cos(rightAngle) * absR);\n bbox.min.set(minX, bounds[1], curveRadius < 0 ? -maxZ : 0);\n bbox.max.set(maxX, bounds[3], curveRadius < 0 ? 0 : maxZ);\n } else {\n bbox.min.set(bounds[0], bounds[1], 0);\n bbox.max.set(bounds[2], bounds[3], 0);\n }\n bbox.getBoundingSphere(this.boundingSphere);\n }\n }\n\n /**\n * Given a clipping rect, and the chunkedBounds from the last updateGlyphs call, choose the lowest\n * `instanceCount` that will show all glyphs within the clipped view. This is an optimization\n * for long blocks of text that are clipped, to skip vertex shader evaluation for glyphs that would\n * be clipped anyway.\n *\n * Note that since `drawElementsInstanced[ANGLE]` only accepts an instance count and not a starting\n * offset, this optimization becomes less effective as the clipRect moves closer to the end of the\n * text block. We could fix that by switching from instancing to a full geometry with a drawRange,\n * but at the expense of much larger attribute buffers (see classdoc above.)\n *\n * @param {Vector4} clipRect\n */\n applyClipRect(clipRect) {\n let count = this.getAttribute(glyphIndexAttrName).count;\n let chunks = this._chunkedBounds;\n if (chunks) {\n for (let i = chunks.length; i--;) {\n count = chunks[i].end;\n let rect = chunks[i].rect;\n // note: both rects are l-b-r-t\n if (rect[1] < clipRect.w && rect[3] > clipRect.y && rect[0] < clipRect.z && rect[2] > clipRect.x) {\n break\n }\n }\n }\n this.instanceCount = count;\n }\n\n /**\n * Utility for updating instance attributes with automatic resizing\n */\n updateAttributeData(attrName, newArray, itemSize) {\n const attr = this.getAttribute(attrName);\n if (newArray) {\n // If length isn't changing, just update the attribute's array data\n if (attr && attr.array.length === newArray.length) {\n attr.array.set(newArray);\n attr.needsUpdate = true;\n } else {\n this.setAttribute(attrName, new InstancedBufferAttribute(newArray, itemSize));\n // If the new attribute has a different size, we also have to (as of r117) manually clear the\n // internal cached max instance count. See https://github.com/mrdoob/three.js/issues/19706\n // It's unclear if this is a threejs bug or a truly unsupported scenario; discussion in\n // that ticket is ambiguous as to whether replacing a BufferAttribute with one of a\n // different size is supported, but https://github.com/mrdoob/three.js/pull/17418 strongly\n // implies it should be supported. It's possible we need to\n delete this._maxInstanceCount; //for r117+, could be fragile\n this.dispose(); //for r118+, more robust feeling, but more heavy-handed than I'd like\n }\n } else if (attr) {\n this.deleteAttribute(attrName);\n }\n }\n}\n\n// language=GLSL\nconst VERTEX_DEFS = `\nuniform vec2 uTroikaSDFTextureSize;\nuniform float uTroikaSDFGlyphSize;\nuniform vec4 uTroikaTotalBounds;\nuniform vec4 uTroikaClipRect;\nuniform mat3 uTroikaOrient;\nuniform bool uTroikaUseGlyphColors;\nuniform float uTroikaEdgeOffset;\nuniform float uTroikaBlurRadius;\nuniform vec2 uTroikaPositionOffset;\nuniform float uTroikaCurveRadius;\nattribute vec4 aTroikaGlyphBounds;\nattribute float aTroikaGlyphIndex;\nattribute vec3 aTroikaGlyphColor;\nvarying vec2 vTroikaGlyphUV;\nvarying vec4 vTroikaTextureUVBounds;\nvarying float vTroikaTextureChannel;\nvarying vec3 vTroikaGlyphColor;\nvarying vec2 vTroikaGlyphDimensions;\n`;\n\n// language=GLSL prefix=\"void main() {\" suffix=\"}\"\nconst VERTEX_TRANSFORM = `\nvec4 bounds = aTroikaGlyphBounds;\nbounds.xz += uTroikaPositionOffset.x;\nbounds.yw -= uTroikaPositionOffset.y;\n\nvec4 outlineBounds = vec4(\n bounds.xy - uTroikaEdgeOffset - uTroikaBlurRadius,\n bounds.zw + uTroikaEdgeOffset + uTroikaBlurRadius\n);\nvec4 clippedBounds = vec4(\n clamp(outlineBounds.xy, uTroikaClipRect.xy, uTroikaClipRect.zw),\n clamp(outlineBounds.zw, uTroikaClipRect.xy, uTroikaClipRect.zw)\n);\n\nvec2 clippedXY = (mix(clippedBounds.xy, clippedBounds.zw, position.xy) - bounds.xy) / (bounds.zw - bounds.xy);\n\nposition.xy = mix(bounds.xy, bounds.zw, clippedXY);\n\nuv = (position.xy - uTroikaTotalBounds.xy) / (uTroikaTotalBounds.zw - uTroikaTotalBounds.xy);\n\nfloat rad = uTroikaCurveRadius;\nif (rad != 0.0) {\n float angle = position.x / rad;\n position.xz = vec2(sin(angle) * rad, rad - cos(angle) * rad);\n normal.xz = vec2(sin(angle), cos(angle));\n}\n \nposition = uTroikaOrient * position;\nnormal = uTroikaOrient * normal;\n\nvTroikaGlyphUV = clippedXY.xy;\nvTroikaGlyphDimensions = vec2(bounds[2] - bounds[0], bounds[3] - bounds[1]);\n\n${''/* NOTE: it seems important to calculate the glyph's bounding texture UVs here in the\n vertex shader, rather than in the fragment shader, as the latter gives strange artifacts\n on some glyphs (those in the leftmost texture column) on some systems. The exact reason\n isn't understood but doing this here, then mix()-ing in the fragment shader, seems to work. */}\nfloat txCols = uTroikaSDFTextureSize.x / uTroikaSDFGlyphSize;\nvec2 txUvPerSquare = uTroikaSDFGlyphSize / uTroikaSDFTextureSize;\nvec2 txStartUV = txUvPerSquare * vec2(\n mod(floor(aTroikaGlyphIndex / 4.0), txCols),\n floor(floor(aTroikaGlyphIndex / 4.0) / txCols)\n);\nvTroikaTextureUVBounds = vec4(txStartUV, vec2(txStartUV) + txUvPerSquare);\nvTroikaTextureChannel = mod(aTroikaGlyphIndex, 4.0);\n`;\n\n// language=GLSL\nconst FRAGMENT_DEFS = `\nuniform sampler2D uTroikaSDFTexture;\nuniform vec2 uTroikaSDFTextureSize;\nuniform float uTroikaSDFGlyphSize;\nuniform float uTroikaSDFExponent;\nuniform float uTroikaEdgeOffset;\nuniform float uTroikaFillOpacity;\nuniform float uTroikaBlurRadius;\nuniform vec3 uTroikaStrokeColor;\nuniform float uTroikaStrokeWidth;\nuniform float uTroikaStrokeOpacity;\nuniform bool uTroikaSDFDebug;\nvarying vec2 vTroikaGlyphUV;\nvarying vec4 vTroikaTextureUVBounds;\nvarying float vTroikaTextureChannel;\nvarying vec2 vTroikaGlyphDimensions;\n\nfloat troikaSdfValueToSignedDistance(float alpha) {\n // Inverse of exponential encoding in webgl-sdf-generator\n ${''/* TODO - there's some slight inaccuracy here when dealing with interpolated alpha values; those\n are linearly interpolated where the encoding is exponential. Look into improving this by rounding\n to nearest 2 whole texels, decoding those exponential values, and linearly interpolating the result.\n */}\n float maxDimension = max(vTroikaGlyphDimensions.x, vTroikaGlyphDimensions.y);\n float absDist = (1.0 - pow(2.0 * (alpha > 0.5 ? 1.0 - alpha : alpha), 1.0 / uTroikaSDFExponent)) * maxDimension;\n float signedDist = absDist * (alpha > 0.5 ? -1.0 : 1.0);\n return signedDist;\n}\n\nfloat troikaGlyphUvToSdfValue(vec2 glyphUV) {\n vec2 textureUV = mix(vTroikaTextureUVBounds.xy, vTroikaTextureUVBounds.zw, glyphUV);\n vec4 rgba = texture2D(uTroikaSDFTexture, textureUV);\n float ch = floor(vTroikaTextureChannel + 0.5); //NOTE: can't use round() in WebGL1\n return ch == 0.0 ? rgba.r : ch == 1.0 ? rgba.g : ch == 2.0 ? rgba.b : rgba.a;\n}\n\nfloat troikaGlyphUvToDistance(vec2 uv) {\n return troikaSdfValueToSignedDistance(troikaGlyphUvToSdfValue(uv));\n}\n\nfloat troikaGetAADist() {\n ${''/*\n When the standard derivatives extension is available, we choose an antialiasing alpha threshold based\n on the potential change in the SDF's alpha from this fragment to its neighbor. This strategy maximizes \n readability and edge crispness at all sizes and screen resolutions.\n */}\n #if defined(GL_OES_standard_derivatives) || __VERSION__ >= 300\n return length(fwidth(vTroikaGlyphUV * vTroikaGlyphDimensions)) * 0.5;\n #else\n return vTroikaGlyphDimensions.x / 64.0;\n #endif\n}\n\nfloat troikaGetFragDistValue() {\n vec2 clampedGlyphUV = clamp(vTroikaGlyphUV, 0.5 / uTroikaSDFGlyphSize, 1.0 - 0.5 / uTroikaSDFGlyphSize);\n float distance = troikaGlyphUvToDistance(clampedGlyphUV);\n \n // Extrapolate distance when outside bounds:\n distance += clampedGlyphUV == vTroikaGlyphUV ? 0.0 : \n length((vTroikaGlyphUV - clampedGlyphUV) * vTroikaGlyphDimensions);\n\n ${''/* \n // TODO more refined extrapolated distance by adjusting for angle of gradient at edge...\n // This has potential but currently gives very jagged extensions, maybe due to precision issues?\n float uvStep = 1.0 / uTroikaSDFGlyphSize;\n vec2 neighbor1UV = clampedGlyphUV + (\n vTroikaGlyphUV.x != clampedGlyphUV.x ? vec2(0.0, uvStep * sign(0.5 - vTroikaGlyphUV.y)) :\n vTroikaGlyphUV.y != clampedGlyphUV.y ? vec2(uvStep * sign(0.5 - vTroikaGlyphUV.x), 0.0) :\n vec2(0.0)\n );\n vec2 neighbor2UV = clampedGlyphUV + (\n vTroikaGlyphUV.x != clampedGlyphUV.x ? vec2(0.0, uvStep * -sign(0.5 - vTroikaGlyphUV.y)) :\n vTroikaGlyphUV.y != clampedGlyphUV.y ? vec2(uvStep * -sign(0.5 - vTroikaGlyphUV.x), 0.0) :\n vec2(0.0)\n );\n float neighbor1Distance = troikaGlyphUvToDistance(neighbor1UV);\n float neighbor2Distance = troikaGlyphUvToDistance(neighbor2UV);\n float distToUnclamped = length((vTroikaGlyphUV - clampedGlyphUV) * vTroikaGlyphDimensions);\n float distToNeighbor = length((clampedGlyphUV - neighbor1UV) * vTroikaGlyphDimensions);\n float gradientAngle1 = min(asin(abs(neighbor1Distance - distance) / distToNeighbor), PI / 2.0);\n float gradientAngle2 = min(asin(abs(neighbor2Distance - distance) / distToNeighbor), PI / 2.0);\n distance += (cos(gradientAngle1) + cos(gradientAngle2)) / 2.0 * distToUnclamped;\n */}\n\n return distance;\n}\n\nfloat troikaGetEdgeAlpha(float distance, float distanceOffset, float aaDist) {\n #if defined(IS_DEPTH_MATERIAL) || defined(IS_DISTANCE_MATERIAL)\n float alpha = step(-distanceOffset, -distance);\n #else\n\n float alpha = smoothstep(\n distanceOffset + aaDist,\n distanceOffset - aaDist,\n distance\n );\n #endif\n\n return alpha;\n}\n`;\n\n// language=GLSL prefix=\"void main() {\" suffix=\"}\"\nconst FRAGMENT_TRANSFORM = `\nfloat aaDist = troikaGetAADist();\nfloat fragDistance = troikaGetFragDistValue();\nfloat edgeAlpha = uTroikaSDFDebug ?\n troikaGlyphUvToSdfValue(vTroikaGlyphUV) :\n troikaGetEdgeAlpha(fragDistance, uTroikaEdgeOffset, max(aaDist, uTroikaBlurRadius));\n\n#if !defined(IS_DEPTH_MATERIAL) && !defined(IS_DISTANCE_MATERIAL)\nvec4 fillRGBA = gl_FragColor;\nfillRGBA.a *= uTroikaFillOpacity;\nvec4 strokeRGBA = uTroikaStrokeWidth == 0.0 ? fillRGBA : vec4(uTroikaStrokeColor, uTroikaStrokeOpacity);\nif (fillRGBA.a == 0.0) fillRGBA.rgb = strokeRGBA.rgb;\ngl_FragColor = mix(fillRGBA, strokeRGBA, smoothstep(\n -uTroikaStrokeWidth - aaDist,\n -uTroikaStrokeWidth + aaDist,\n fragDistance\n));\ngl_FragColor.a *= edgeAlpha;\n#endif\n\nif (edgeAlpha == 0.0) {\n discard;\n}\n`;\n\n\n/**\n * Create a material for rendering text, derived from a baseMaterial\n */\nfunction createTextDerivedMaterial(baseMaterial) {\n const textMaterial = createDerivedMaterial(baseMaterial, {\n chained: true,\n extensions: {\n derivatives: true\n },\n uniforms: {\n uTroikaSDFTexture: {value: null},\n uTroikaSDFTextureSize: {value: new Vector2()},\n uTroikaSDFGlyphSize: {value: 0},\n uTroikaSDFExponent: {value: 0},\n uTroikaTotalBounds: {value: new Vector4(0,0,0,0)},\n uTroikaClipRect: {value: new Vector4(0,0,0,0)},\n uTroikaEdgeOffset: {value: 0},\n uTroikaFillOpacity: {value: 1},\n uTroikaPositionOffset: {value: new Vector2()},\n uTroikaCurveRadius: {value: 0},\n uTroikaBlurRadius: {value: 0},\n uTroikaStrokeWidth: {value: 0},\n uTroikaStrokeColor: {value: new Color()},\n uTroikaStrokeOpacity: {value: 1},\n uTroikaOrient: {value: new Matrix3()},\n uTroikaUseGlyphColors: {value: true},\n uTroikaSDFDebug: {value: false}\n },\n vertexDefs: VERTEX_DEFS,\n vertexTransform: VERTEX_TRANSFORM,\n fragmentDefs: FRAGMENT_DEFS,\n fragmentColorTransform: FRAGMENT_TRANSFORM,\n customRewriter({vertexShader, fragmentShader}) {\n let uDiffuseRE = /\\buniform\\s+vec3\\s+diffuse\\b/;\n if (uDiffuseRE.test(fragmentShader)) {\n // Replace all instances of `diffuse` with our varying\n fragmentShader = fragmentShader\n .replace(uDiffuseRE, 'varying vec3 vTroikaGlyphColor')\n .replace(/\\bdiffuse\\b/g, 'vTroikaGlyphColor');\n // Make sure the vertex shader declares the uniform so we can grab it as a fallback\n if (!uDiffuseRE.test(vertexShader)) {\n vertexShader = vertexShader.replace(\n voidMainRegExp,\n 'uniform vec3 diffuse;\\n$&\\nvTroikaGlyphColor = uTroikaUseGlyphColors ? aTroikaGlyphColor / 255.0 : diffuse;\\n'\n );\n }\n }\n return { vertexShader, fragmentShader }\n }\n });\n\n // Force transparency - TODO is this reasonable?\n textMaterial.transparent = true;\n\n // Force single draw call when double-sided\n textMaterial.forceSinglePass = true;\n\n Object.defineProperties(textMaterial, {\n isTroikaTextMaterial: {value: true},\n\n // WebGLShadowMap reverses the side of the shadow material by default, which fails\n // for planes, so here we force the `shadowSide` to always match the main side.\n shadowSide: {\n get() {\n return this.side\n },\n set() {\n //no-op\n }\n }\n });\n\n return textMaterial\n}\n\nconst defaultMaterial = /*#__PURE__*/ new MeshBasicMaterial({\n color: 0xffffff,\n side: DoubleSide,\n transparent: true\n});\nconst defaultStrokeColor = 0x808080;\n\nconst tempMat4 = /*#__PURE__*/ new Matrix4();\nconst tempVec3a = /*#__PURE__*/ new Vector3();\nconst tempVec3b = /*#__PURE__*/ new Vector3();\nconst tempArray = [];\nconst origin = /*#__PURE__*/ new Vector3();\nconst defaultOrient = '+x+y';\n\nfunction first(o) {\n return Array.isArray(o) ? o[0] : o\n}\n\nlet getFlatRaycastMesh = () => {\n const mesh = new Mesh(\n new PlaneGeometry(1, 1),\n defaultMaterial\n );\n getFlatRaycastMesh = () => mesh;\n return mesh\n};\nlet getCurvedRaycastMesh = () => {\n const mesh = new Mesh(\n new PlaneGeometry(1, 1, 32, 1),\n defaultMaterial\n );\n getCurvedRaycastMesh = () => mesh;\n return mesh\n};\n\nconst syncStartEvent = { type: 'syncstart' };\nconst syncCompleteEvent = { type: 'synccomplete' };\n\nconst SYNCABLE_PROPS = [\n 'font',\n 'fontSize',\n 'fontStyle',\n 'fontWeight',\n 'lang',\n 'letterSpacing',\n 'lineHeight',\n 'maxWidth',\n 'overflowWrap',\n 'text',\n 'direction',\n 'textAlign',\n 'textIndent',\n 'whiteSpace',\n 'anchorX',\n 'anchorY',\n 'colorRanges',\n 'sdfGlyphSize'\n];\n\nconst COPYABLE_PROPS = SYNCABLE_PROPS.concat(\n 'material',\n 'color',\n 'depthOffset',\n 'clipRect',\n 'curveRadius',\n 'orientation',\n 'glyphGeometryDetail'\n);\n\n/**\n * @class Text\n *\n * A ThreeJS Mesh that renders a string of text on a plane in 3D space using signed distance\n * fields (SDF).\n */\nclass Text extends Mesh {\n constructor() {\n const geometry = new GlyphsGeometry();\n super(geometry, null);\n\n // === Text layout properties: === //\n\n /**\n * @member {string} text\n * The string of text to be rendered.\n */\n this.text = '';\n\n /**\n * @member {number|string} anchorX\n * Defines the horizontal position in the text block that should line up with the local origin.\n * Can be specified as a numeric x position in local units, a string percentage of the total\n * text block width e.g. `'25%'`, or one of the following keyword strings: 'left', 'center',\n * or 'right'.\n */\n this.anchorX = 0;\n\n /**\n * @member {number|string} anchorY\n * Defines the vertical position in the text block that should line up with the local origin.\n * Can be specified as a numeric y position in local units (note: down is negative y), a string\n * percentage of the total text block height e.g. `'25%'`, or one of the following keyword strings:\n * 'top', 'top-baseline', 'top-cap', 'top-ex', 'middle', 'bottom-baseline', or 'bottom'.\n */\n this.anchorY = 0;\n\n /**\n * @member {number} curveRadius\n * Defines a cylindrical radius along which the text's plane will be curved. Positive numbers put\n * the cylinder's centerline (oriented vertically) that distance in front of the text, for a concave\n * curvature, while negative numbers put it behind the text for a convex curvature. The centerline\n * will be aligned with the text's local origin; you can use `anchorX` to offset it.\n *\n * Since each glyph is by default rendered with a simple quad, each glyph remains a flat plane\n * internally. You can use `glyphGeometryDetail` to add more vertices for curvature inside glyphs.\n */\n this.curveRadius = 0;\n\n /**\n * @member {string} direction\n * Sets the base direction for the text. The default value of \"auto\" will choose a direction based\n * on the text's content according to the bidi spec. A value of \"ltr\" or \"rtl\" will force the direction.\n */\n this.direction = 'auto';\n\n /**\n * @member {string|null} font\n * URL of a custom font to be used. Font files can be in .ttf, .otf, or .woff (not .woff2) formats.\n * Defaults to Noto Sans.\n */\n this.font = null; //will use default from TextBuilder\n\n this.unicodeFontsURL = null; //defaults to CDN\n\n /**\n * @member {number} fontSize\n * The size at which to render the font in local units; corresponds to the em-box height\n * of the chosen `font`.\n */\n this.fontSize = 0.1;\n\n /**\n * @member {number|'normal'|'bold'}\n * The weight of the font. Currently only used for fallback Noto fonts.\n */\n this.fontWeight = 'normal';\n\n /**\n * @member {'normal'|'italic'}\n * The style of the font. Currently only used for fallback Noto fonts.\n */\n this.fontStyle = 'normal';\n\n /**\n * @member {string|null} lang\n * The language code of this text; can be used for explicitly selecting certain CJK fonts.\n */\n this.lang = null;\n\n /**\n * @member {number} letterSpacing\n * Sets a uniform adjustment to spacing between letters after kerning is applied. Positive\n * numbers increase spacing and negative numbers decrease it.\n */\n this.letterSpacing = 0;\n\n /**\n * @member {number|string} lineHeight\n * Sets the height of each line of text, as a multiple of the `fontSize`. Defaults to 'normal'\n * which chooses a reasonable height based on the chosen font's ascender/descender metrics.\n */\n this.lineHeight = 'normal';\n\n /**\n * @member {number} maxWidth\n * The maximum width of the text block, above which text may start wrapping according to the\n * `whiteSpace` and `overflowWrap` properties.\n */\n this.maxWidth = Infinity;\n\n /**\n * @member {string} overflowWrap\n * Defines how text wraps if the `whiteSpace` property is `normal`. Can be either `'normal'`\n * to break at whitespace characters, or `'break-word'` to allow breaking within words.\n * Defaults to `'normal'`.\n */\n this.overflowWrap = 'normal';\n\n /**\n * @member {string} textAlign\n * The horizontal alignment of each line of text within the overall text bounding box.\n */\n this.textAlign = 'left';\n\n /**\n * @member {number} textIndent\n * Indentation for the first character of a line; see CSS `text-indent`.\n */\n this.textIndent = 0;\n\n /**\n * @member {string} whiteSpace\n * Defines whether text should wrap when a line reaches the `maxWidth`. Can\n * be either `'normal'` (the default), to allow wrapping according to the `overflowWrap` property,\n * or `'nowrap'` to prevent wrapping. Note that `'normal'` here honors newline characters to\n * manually break lines, making it behave more like `'pre-wrap'` does in CSS.\n */\n this.whiteSpace = 'normal';\n\n\n // === Presentation properties: === //\n\n /**\n * @member {THREE.Material} material\n * Defines a _base_ material to be used when rendering the text. This material will be\n * automatically replaced with a material derived from it, that adds shader code to\n * decrease the alpha for each fragment (pixel) outside the text glyphs, with antialiasing.\n * By default it will derive from a simple white MeshBasicMaterial, but you can use any\n * of the other mesh materials to gain other features like lighting, texture maps, etc.\n *\n * Also see the `color` shortcut property.\n */\n this.material = null;\n\n /**\n * @member {string|number|THREE.Color} color\n * This is a shortcut for setting the `color` of the text's material. You can use this\n * if you don't want to specify a whole custom `material`. Also, if you do use a custom\n * `material`, this color will only be used for this particuar Text instance, even if\n * that same material instance is shared across multiple Text objects.\n */\n this.color = null;\n\n /**\n * @member {object|null} colorRanges\n * WARNING: This API is experimental and may change.\n * This allows more fine-grained control of colors for individual or ranges of characters,\n * taking precedence over the material's `color`. Its format is an Object whose keys each\n * define a starting character index for a range, and whose values are the color for each\n * range. The color value can be a numeric hex color value, a `THREE.Color` object, or\n * any of the strings accepted by `THREE.Color`.\n */\n this.colorRanges = null;\n\n /**\n * @member {number|string} outlineWidth\n * WARNING: This API is experimental and may change.\n * The width of an outline/halo to be drawn around each text glyph using the `outlineColor` and `outlineOpacity`.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g.\n * `\"12%\"` which is treated as a percentage of the `fontSize`. Defaults to `0`, which means\n * no outline will be drawn unless an `outlineOffsetX/Y` or `outlineBlur` is set.\n */\n this.outlineWidth = 0;\n\n /**\n * @member {string|number|THREE.Color} outlineColor\n * WARNING: This API is experimental and may change.\n * The color of the text outline, if `outlineWidth`/`outlineBlur`/`outlineOffsetX/Y` are set.\n * Defaults to black.\n */\n this.outlineColor = 0x000000;\n\n /**\n * @member {number} outlineOpacity\n * WARNING: This API is experimental and may change.\n * The opacity of the outline, if `outlineWidth`/`outlineBlur`/`outlineOffsetX/Y` are set.\n * Defaults to `1`.\n */\n this.outlineOpacity = 1;\n\n /**\n * @member {number|string} outlineBlur\n * WARNING: This API is experimental and may change.\n * A blur radius applied to the outer edge of the text's outline. If the `outlineWidth` is\n * zero, the blur will be applied at the glyph edge, like CSS's `text-shadow` blur radius.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g.\n * `\"12%\"` which is treated as a percentage of the `fontSize`. Defaults to `0`.\n */\n this.outlineBlur = 0;\n\n /**\n * @member {number|string} outlineOffsetX\n * WARNING: This API is experimental and may change.\n * A horizontal offset for the text outline.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g. `\"12%\"`\n * which is treated as a percentage of the `fontSize`. Defaults to `0`.\n */\n this.outlineOffsetX = 0;\n\n /**\n * @member {number|string} outlineOffsetY\n * WARNING: This API is experimental and may change.\n * A vertical offset for the text outline.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g. `\"12%\"`\n * which is treated as a percentage of the `fontSize`. Defaults to `0`.\n */\n this.outlineOffsetY = 0;\n\n /**\n * @member {number|string} strokeWidth\n * WARNING: This API is experimental and may change.\n * The width of an inner stroke drawn inside each text glyph using the `strokeColor` and `strokeOpacity`.\n * Can be specified as either an absolute number in local units, or as a percentage string e.g. `\"12%\"`\n * which is treated as a percentage of the `fontSize`. Defaults to `0`.\n */\n this.strokeWidth = 0;\n\n /**\n * @member {string|number|THREE.Color} strokeColor\n * WARNING: This API is experimental and may change.\n * The color of the text stroke, if `strokeWidth` is greater than zero. Defaults to gray.\n */\n this.strokeColor = defaultStrokeColor;\n\n /**\n * @member {number} strokeOpacity\n * WARNING: This API is experimental and may change.\n * The opacity of the stroke, if `strokeWidth` is greater than zero. Defaults to `1`.\n */\n this.strokeOpacity = 1;\n\n /**\n * @member {number} fillOpacity\n * WARNING: This API is experimental and may change.\n * The opacity of the glyph's fill from 0 to 1. This behaves like the material's `opacity` but allows\n * giving the fill a different opacity than the `strokeOpacity`. A fillOpacity of `0` makes the\n * interior of the glyph invisible, leaving just the `strokeWidth`. Defaults to `1`.\n */\n this.fillOpacity = 1;\n\n /**\n * @member {number} depthOffset\n * This is a shortcut for setting the material's `polygonOffset` and related properties,\n * which can be useful in preventing z-fighting when this text is laid on top of another\n * plane in the scene. Positive numbers are further from the camera, negatives closer.\n */\n this.depthOffset = 0;\n\n /**\n * @member {Array<number>} clipRect\n * If specified, defines a `[minX, minY, maxX, maxY]` of a rectangle outside of which all\n * pixels will be discarded. This can be used for example to clip overflowing text when\n * `whiteSpace='nowrap'`.\n */\n this.clipRect = null;\n\n /**\n * @member {string} orientation\n * Defines the axis plane on which the text should be laid out when the mesh has no extra\n * rotation transform. It is specified as a string with two axes: the horizontal axis with\n * positive pointing right, and the vertical axis with positive pointing up. By default this\n * is '+x+y', meaning the text sits on the xy plane with the text's top toward positive y\n * and facing positive z. A value of '+x-z' would place it on the xz plane with the text's\n * top toward negative z and facing positive y.\n */\n this.orientation = defaultOrient;\n\n /**\n * @member {number} glyphGeometryDetail\n * Controls number of vertical/horizontal segments that make up each glyph's rectangular\n * plane. Defaults to 1. This can be increased to provide more geometrical detail for custom\n * vertex shader effects, for example.\n */\n this.glyphGeometryDetail = 1;\n\n /**\n * @member {number|null} sdfGlyphSize\n * The size of each glyph's SDF (signed distance field) used for rendering. This must be a\n * power-of-two number. Defaults to 64 which is generally a good balance of size and quality\n * for most fonts. Larger sizes can improve the quality of glyph rendering by increasing\n * the sharpness of corners and preventing loss of very thin lines, at the expense of\n * increased memory footprint and longer SDF generation time.\n */\n this.sdfGlyphSize = null;\n\n /**\n * @member {boolean} gpuAccelerateSDF\n * When `true`, the SDF generation process will be GPU-accelerated with WebGL when possible,\n * making it much faster especially for complex glyphs, and falling back to a JavaScript version\n * executed in web workers when support isn't available. It should automatically detect support,\n * but it's still somewhat experimental, so you can set it to `false` to force it to use the JS\n * version if you encounter issues with it.\n */\n this.gpuAccelerateSDF = true;\n\n this.debugSDF = false;\n }\n\n /**\n * Updates the text rendering according to the current text-related configuration properties.\n * This is an async process, so you can pass in a callback function to be executed when it\n * finishes.\n * @param {function} [callback]\n */\n sync(callback) {\n if (this._needsSync) {\n this._needsSync = false;\n\n // If there's another sync still in progress, queue\n if (this._isSyncing) {\n (this._queuedSyncs || (this._queuedSyncs = [])).push(callback);\n } else {\n this._isSyncing = true;\n this.dispatchEvent(syncStartEvent);\n\n getTextRenderInfo({\n text: this.text,\n font: this.font,\n lang: this.lang,\n fontSize: this.fontSize || 0.1,\n fontWeight: this.fontWeight || 'normal',\n fontStyle: this.fontStyle || 'normal',\n letterSpacing: this.letterSpacing || 0,\n lineHeight: this.lineHeight || 'normal',\n maxWidth: this.maxWidth,\n direction: this.direction || 'auto',\n textAlign: this.textAlign,\n textIndent: this.textIndent,\n whiteSpace: this.whiteSpace,\n overflowWrap: this.overflowWrap,\n anchorX: this.anchorX,\n anchorY: this.anchorY,\n colorRanges: this.colorRanges,\n includeCaretPositions: true, //TODO parameterize\n sdfGlyphSize: this.sdfGlyphSize,\n gpuAccelerateSDF: this.gpuAccelerateSDF,\n unicodeFontsURL: this.unicodeFontsURL,\n }, textRenderInfo => {\n this._isSyncing = false;\n\n // Save result for later use in onBeforeRender\n this._textRenderInfo = textRenderInfo;\n\n // Update the geometry attributes\n this.geometry.updateGlyphs(\n textRenderInfo.glyphBounds,\n textRenderInfo.glyphAtlasIndices,\n textRenderInfo.blockBounds,\n textRenderInfo.chunkedBounds,\n textRenderInfo.glyphColors\n );\n\n // If we had extra sync requests queued up, kick it off\n const queued = this._queuedSyncs;\n if (queued) {\n this._queuedSyncs = null;\n this._needsSync = true;\n this.sync(() => {\n queued.forEach(fn => fn && fn());\n });\n }\n\n this.dispatchEvent(syncCompleteEvent);\n if (callback) {\n callback();\n }\n });\n }\n }\n }\n\n /**\n * Initiate a sync if needed - note it won't complete until next frame at the\n * earliest so if possible it's a good idea to call sync() manually as soon as\n * all the properties have been set.\n * @override\n */\n onBeforeRender(renderer, scene, camera, geometry, material, group) {\n this.sync();\n\n // This may not always be a text material, e.g. if there's a scene.overrideMaterial present\n if (material.isTroikaTextMaterial) {\n this._prepareForRender(material);\n }\n }\n\n /**\n * Shortcut to dispose the geometry specific to this instance.\n * Note: we don't also dispose the derived material here because if anything else is\n * sharing the same base material it will result in a pause next frame as the program\n * is recompiled. Instead users can dispose the base material manually, like normal,\n * and we'll also dispose the derived material at that time.\n */\n dispose() {\n this.geometry.dispose();\n }\n\n /**\n * @property {TroikaTextRenderInfo|null} textRenderInfo\n * @readonly\n * The current processed rendering data for this TextMesh, returned by the TextBuilder after\n * a `sync()` call. This will be `null` initially, and may be stale for a short period until\n * the asynchrous `sync()` process completes.\n */\n get textRenderInfo() {\n return this._textRenderInfo || null\n }\n\n /**\n * Create the text derived material from the base material. Can be overridden to use a custom\n * derived material.\n */\n createDerivedMaterial(baseMaterial) {\n return createTextDerivedMaterial(baseMaterial)\n }\n\n // Handler for automatically wrapping the base material with our upgrades. We do the wrapping\n // lazily on _read_ rather than write to avoid unnecessary wrapping on transient values.\n get material() {\n let derivedMaterial = this._derivedMaterial;\n const baseMaterial = this._baseMaterial || this._defaultMaterial || (this._defaultMaterial = defaultMaterial.clone());\n if (!derivedMaterial || !derivedMaterial.isDerivedFrom(baseMaterial)) {\n derivedMaterial = this._derivedMaterial = this.createDerivedMaterial(baseMaterial);\n // dispose the derived material when its base material is disposed:\n baseMaterial.addEventListener('dispose', function onDispose() {\n baseMaterial.removeEventListener('dispose', onDispose);\n derivedMaterial.dispose();\n });\n }\n // If text outline is configured, render it as a preliminary draw using Three's multi-material\n // feature (see GlyphsGeometry which sets up `groups` for this purpose) Doing it with multi\n // materials ensures the layers are always rendered consecutively in a consistent order.\n // Each layer will trigger onBeforeRender with the appropriate material.\n if (this.hasOutline()) {\n let outlineMaterial = derivedMaterial._outlineMtl;\n if (!outlineMaterial) {\n outlineMaterial = derivedMaterial._outlineMtl = Object.create(derivedMaterial, {\n id: {value: derivedMaterial.id + 0.1}\n });\n outlineMaterial.isTextOutlineMaterial = true;\n outlineMaterial.depthWrite = false;\n outlineMaterial.map = null; //???\n derivedMaterial.addEventListener('dispose', function onDispose() {\n derivedMaterial.removeEventListener('dispose', onDispose);\n outlineMaterial.dispose();\n });\n }\n return [\n outlineMaterial,\n derivedMaterial\n ]\n } else {\n return derivedMaterial\n }\n }\n set material(baseMaterial) {\n if (baseMaterial && baseMaterial.isTroikaTextMaterial) { //prevent double-derivation\n this._derivedMaterial = baseMaterial;\n this._baseMaterial = baseMaterial.baseMaterial;\n } else {\n this._baseMaterial = baseMaterial;\n }\n }\n\n hasOutline() {\n return !!(this.outlineWidth || this.outlineBlur || this.outlineOffsetX || this.outlineOffsetY)\n }\n\n get glyphGeometryDetail() {\n return this.geometry.detail\n }\n set glyphGeometryDetail(detail) {\n this.geometry.detail = detail;\n }\n\n get curveRadius() {\n return this.geometry.curveRadius\n }\n set curveRadius(r) {\n this.geometry.curveRadius = r;\n }\n\n // Create and update material for shadows upon request:\n get customDepthMaterial() {\n return first(this.material).getDepthMaterial()\n }\n set customDepthMaterial(m) {\n // future: let the user override with their own?\n }\n get customDistanceMaterial() {\n return first(this.material).getDistanceMaterial()\n }\n set customDistanceMaterial(m) {\n // future: let the user override with their own?\n }\n\n _prepareForRender(material) {\n const isOutline = material.isTextOutlineMaterial;\n const uniforms = material.uniforms;\n const textInfo = this.textRenderInfo;\n if (textInfo) {\n const {sdfTexture, blockBounds} = textInfo;\n uniforms.uTroikaSDFTexture.value = sdfTexture;\n uniforms.uTroikaSDFTextureSize.value.set(sdfTexture.image.width, sdfTexture.image.height);\n uniforms.uTroikaSDFGlyphSize.value = textInfo.sdfGlyphSize;\n uniforms.uTroikaSDFExponent.value = textInfo.sdfExponent;\n uniforms.uTroikaTotalBounds.value.fromArray(blockBounds);\n uniforms.uTroikaUseGlyphColors.value = !isOutline && !!textInfo.glyphColors;\n\n let distanceOffset = 0;\n let blurRadius = 0;\n let strokeWidth = 0;\n let fillOpacity;\n let strokeOpacity;\n let strokeColor;\n let offsetX = 0;\n let offsetY = 0;\n\n if (isOutline) {\n let {outlineWidth, outlineOffsetX, outlineOffsetY, outlineBlur, outlineOpacity} = this;\n distanceOffset = this._parsePercent(outlineWidth) || 0;\n blurRadius = Math.max(0, this._parsePercent(outlineBlur) || 0);\n fillOpacity = outlineOpacity;\n offsetX = this._parsePercent(outlineOffsetX) || 0;\n offsetY = this._parsePercent(outlineOffsetY) || 0;\n } else {\n strokeWidth = Math.max(0, this._parsePercent(this.strokeWidth) || 0);\n if (strokeWidth) {\n strokeColor = this.strokeColor;\n uniforms.uTroikaStrokeColor.value.set(strokeColor == null ? defaultStrokeColor : strokeColor);\n strokeOpacity = this.strokeOpacity;\n if (strokeOpacity == null) strokeOpacity = 1;\n }\n fillOpacity = this.fillOpacity;\n }\n\n uniforms.uTroikaEdgeOffset.value = distanceOffset;\n uniforms.uTroikaPositionOffset.value.set(offsetX, offsetY);\n uniforms.uTroikaBlurRadius.value = blurRadius;\n uniforms.uTroikaStrokeWidth.value = strokeWidth;\n uniforms.uTroikaStrokeOpacity.value = strokeOpacity;\n uniforms.uTroikaFillOpacity.value = fillOpacity == null ? 1 : fillOpacity;\n uniforms.uTroikaCurveRadius.value = this.curveRadius || 0;\n\n let clipRect = this.clipRect;\n if (clipRect && Array.isArray(clipRect) && clipRect.length === 4) {\n uniforms.uTroikaClipRect.value.fromArray(clipRect);\n } else {\n // no clipping - choose a finite rect that shouldn't ever be reached by overflowing glyphs or outlines\n const pad = (this.fontSize || 0.1) * 100;\n uniforms.uTroikaClipRect.value.set(\n blockBounds[0] - pad,\n blockBounds[1] - pad,\n blockBounds[2] + pad,\n blockBounds[3] + pad\n );\n }\n this.geometry.applyClipRect(uniforms.uTroikaClipRect.value);\n }\n uniforms.uTroikaSDFDebug.value = !!this.debugSDF;\n material.polygonOffset = !!this.depthOffset;\n material.polygonOffsetFactor = material.polygonOffsetUnits = this.depthOffset || 0;\n\n // Shortcut for setting material color via `color` prop on the mesh; this is\n // applied only to the derived material to avoid mutating a shared base material.\n const color = isOutline ? (this.outlineColor || 0) : this.color;\n\n if (color == null) {\n delete material.color; //inherit from base\n } else {\n const colorObj = material.hasOwnProperty('color') ? material.color : (material.color = new Color());\n if (color !== colorObj._input || typeof color === 'object') {\n colorObj.set(colorObj._input = color);\n }\n }\n\n // base orientation\n let orient = this.orientation || defaultOrient;\n if (orient !== material._orientation) {\n let rotMat = uniforms.uTroikaOrient.value;\n orient = orient.replace(/[^-+xyz]/g, '');\n let match = orient !== defaultOrient && orient.match(/^([-+])([xyz])([-+])([xyz])$/);\n if (match) {\n let [, hSign, hAxis, vSign, vAxis] = match;\n tempVec3a.set(0, 0, 0)[hAxis] = hSign === '-' ? 1 : -1;\n tempVec3b.set(0, 0, 0)[vAxis] = vSign === '-' ? -1 : 1;\n tempMat4.lookAt(origin, tempVec3a.cross(tempVec3b), tempVec3b);\n rotMat.setFromMatrix4(tempMat4);\n } else {\n rotMat.identity();\n }\n material._orientation = orient;\n }\n }\n\n _parsePercent(value) {\n if (typeof value === 'string') {\n let match = value.match(/^(-?[\\d.]+)%$/);\n let pct = match ? parseFloat(match[1]) : NaN;\n value = (isNaN(pct) ? 0 : pct / 100) * this.fontSize;\n }\n return value\n }\n\n /**\n * Translate a point in local space to an x/y in the text plane.\n */\n localPositionToTextCoords(position, target = new Vector2()) {\n target.copy(position); //simple non-curved case is 1:1\n const r = this.curveRadius;\n if (r) { //flatten the curve\n target.x = Math.atan2(position.x, Math.abs(r) - Math.abs(position.z)) * Math.abs(r);\n }\n return target\n }\n\n /**\n * Translate a point in world space to an x/y in the text plane.\n */\n worldPositionToTextCoords(position, target = new Vector2()) {\n tempVec3a.copy(position);\n return this.localPositionToTextCoords(this.worldToLocal(tempVec3a), target)\n }\n\n /**\n * @override Custom raycasting to test against the whole text block's max rectangular bounds\n * TODO is there any reason to make this more granular, like within individual line or glyph rects?\n */\n raycast(raycaster, intersects) {\n const {textRenderInfo, curveRadius} = this;\n if (textRenderInfo) {\n const bounds = textRenderInfo.blockBounds;\n const raycastMesh = curveRadius ? getCurvedRaycastMesh() : getFlatRaycastMesh();\n const geom = raycastMesh.geometry;\n const {position, uv} = geom.attributes;\n for (let i = 0; i < uv.count; i++) {\n let x = bounds[0] + (uv.getX(i) * (bounds[2] - bounds[0]));\n const y = bounds[1] + (uv.getY(i) * (bounds[3] - bounds[1]));\n let z = 0;\n if (curveRadius) {\n z = curveRadius - Math.cos(x / curveRadius) * curveRadius;\n x = Math.sin(x / curveRadius) * curveRadius;\n }\n position.setXYZ(i, x, y, z);\n }\n geom.boundingSphere = this.geometry.boundingSphere;\n geom.boundingBox = this.geometry.boundingBox;\n raycastMesh.matrixWorld = this.matrixWorld;\n raycastMesh.material.side = this.material.side;\n tempArray.length = 0;\n raycastMesh.raycast(raycaster, tempArray);\n for (let i = 0; i < tempArray.length; i++) {\n tempArray[i].object = this;\n intersects.push(tempArray[i]);\n }\n }\n }\n\n copy(source) {\n // Prevent copying the geometry reference so we don't end up sharing attributes between instances\n const geom = this.geometry;\n super.copy(source);\n this.geometry = geom;\n\n COPYABLE_PROPS.forEach(prop => {\n this[prop] = source[prop];\n });\n return this\n }\n\n clone() {\n return new this.constructor().copy(this)\n }\n}\n\n\n// Create setters for properties that affect text layout:\nSYNCABLE_PROPS.forEach(prop => {\n const privateKey = '_private_' + prop;\n Object.defineProperty(Text.prototype, prop, {\n get() {\n return this[privateKey]\n },\n set(value) {\n if (value !== this[privateKey]) {\n this[privateKey] = value;\n this._needsSync = true;\n }\n }\n });\n});\n\nconst syncStartEvent$1 = { type: \"syncstart\" };\nconst syncCompleteEvent$1 = { type: \"synccomplete\" };\nconst memberIndexAttrName = \"aTroikaTextBatchMemberIndex\";\n\n\n/*\nData texture packing strategy:\n\n# Common:\n0-15: matrix\n16-19: uTroikaTotalBounds\n20-23: uTroikaClipRect\n24: diffuse (color/outlineColor)\n25: uTroikaFillOpacity (fillOpacity/outlineOpacity)\n26: uTroikaCurveRadius\n27: <blank>\n\n# Main:\n28: uTroikaStrokeWidth\n29: uTroikaStrokeColor\n30: uTroikaStrokeOpacity\n\n# Outline:\n28-29: uTroikaPositionOffset\n30: uTroikaEdgeOffset\n31: uTroikaBlurRadius\n*/\nconst floatsPerMember = 32;\n\nconst tempBox3 = new Box3();\nconst tempColor$1 = new Color();\n\n/**\n * @experimental\n *\n * A specialized `Text` implementation that accepts any number of `Text` children\n * and automatically batches them together to render in a single draw call.\n *\n * The `material` of each child `Text` will be ignored, and the `material` of the\n * `BatchedText` will be used for all of them instead.\n *\n * NOTE: This only works in WebGL2 or where the OES_texture_float extension is available.\n */\nclass BatchedText extends Text {\n constructor () {\n super();\n\n /**\n * @typedef {Object} PackingInfo\n * @property {number} index - the packing order index when last packed, or -1\n * @property {boolean} dirty - whether it has synced since last pack\n */\n\n /**\n * @type {Map<Text, PackingInfo>}\n */\n this._members = new Map();\n this._dataTextures = {};\n\n this._onMemberSynced = (e) => {\n this._members.get(e.target).dirty = true;\n };\n }\n\n /**\n * @override\n * Batch any Text objects added as children\n */\n add (...objects) {\n for (let i = 0; i < objects.length; i++) {\n if (objects[i] instanceof Text) {\n this.addText(objects[i]);\n } else {\n super.add(objects[i]);\n }\n }\n return this;\n }\n\n /**\n * @override\n */\n remove (...objects) {\n for (let i = 0; i < objects.length; i++) {\n if (objects[i] instanceof Text) {\n this.removeText(objects[i]);\n } else {\n super.remove(objects[i]);\n }\n }\n return this;\n }\n\n /**\n * @param {Text} text\n */\n addText (text) {\n if (!this._members.has(text)) {\n this._members.set(text, {\n index: -1,\n glyphCount: -1,\n dirty: true\n });\n text.addEventListener(\"synccomplete\", this._onMemberSynced);\n }\n }\n\n /**\n * @param {Text} text\n */\n removeText (text) {\n this._needsRepack = true;\n text.removeEventListener(\"synccomplete\", this._onMemberSynced);\n this._members.delete(text);\n }\n\n /**\n * Use the custom derivation with extra batching logic\n */\n createDerivedMaterial (baseMaterial) {\n return createBatchedTextMaterial(baseMaterial);\n }\n\n updateMatrixWorld (force) {\n super.updateMatrixWorld(force);\n this.updateBounds();\n }\n\n /**\n * Update the batched geometry bounds to hold all members\n */\n updateBounds () {\n // Update member local matrices and the overall bounds\n const bbox = this.geometry.boundingBox.makeEmpty();\n this._members.forEach((_, text) => {\n if (text.matrixAutoUpdate) text.updateMatrix(); // ignore world matrix\n tempBox3.copy(text.geometry.boundingBox).applyMatrix4(text.matrix);\n bbox.union(tempBox3);\n });\n bbox.getBoundingSphere(this.geometry.boundingSphere);\n }\n\n /** @override */\n hasOutline() {\n // Iterator.some() not supported in Safari\n for (let member of this._members.keys()) {\n if (member.hasOutline()) return true;\n }\n return false;\n }\n\n /**\n * @override\n * Copy member matrices and uniform values into the data texture\n */\n _prepareForRender (material) {\n const isOutline = material.isTextOutlineMaterial;\n material.uniforms.uTroikaIsOutline.value = isOutline;\n\n // Resize the texture to fit in powers of 2\n let texture = this._dataTextures[isOutline ? 'outline' : 'main'];\n const dataLength = Math.pow(2, Math.ceil(Math.log2(this._members.size * floatsPerMember)));\n if (!texture || dataLength !== texture.image.data.length) {\n // console.log(`resizing: ${dataLength}`);\n if (texture) texture.dispose();\n const width = Math.min(dataLength / 4, 1024);\n texture = this._dataTextures[isOutline ? 'outline' : 'main'] = new DataTexture(\n new Float32Array(dataLength),\n width,\n dataLength / 4 / width,\n RGBAFormat,\n FloatType\n );\n }\n\n const texData = texture.image.data;\n const setTexData = (index, value) => {\n if (value !== texData[index]) {\n texData[index] = value;\n texture.needsUpdate = true;\n }\n };\n this._members.forEach(({ index, dirty }, text) => {\n if (index > -1) {\n const startIndex = index * floatsPerMember;\n\n // Matrix\n const matrix = text.matrix.elements;\n for (let i = 0; i < 16; i++) {\n setTexData(startIndex + i, matrix[i]);\n }\n\n // Let the member populate the uniforms, since that does all the appropriate\n // logic and handling of defaults, and we'll just grab the results from there\n text._prepareForRender(material);\n const {\n uTroikaTotalBounds,\n uTroikaClipRect,\n uTroikaPositionOffset,\n uTroikaEdgeOffset,\n uTroikaBlurRadius,\n uTroikaStrokeWidth,\n uTroikaStrokeColor,\n uTroikaStrokeOpacity,\n uTroikaFillOpacity,\n uTroikaCurveRadius,\n } = material.uniforms;\n\n // Total bounds for uv\n for (let i = 0; i < 4; i++) {\n setTexData(startIndex + 16 + i, uTroikaTotalBounds.value.getComponent(i));\n }\n\n // Clip rect\n for (let i = 0; i < 4; i++) {\n setTexData(startIndex + 20 + i, uTroikaClipRect.value.getComponent(i));\n }\n\n // Color\n let color = isOutline ? (text.outlineColor || 0) : text.color;\n if (color == null) color = this.color;\n if (color == null) color = this.material.color;\n if (color == null) color = 0xffffff;\n setTexData(startIndex + 24, tempColor$1.set(color).getHex());\n\n // Fill opacity / outline opacity\n setTexData(startIndex + 25, uTroikaFillOpacity.value);\n\n // Curve radius\n setTexData(startIndex + 26, uTroikaCurveRadius.value);\n\n if (isOutline) {\n // Outline properties\n setTexData(startIndex + 28, uTroikaPositionOffset.value.x);\n setTexData(startIndex + 29, uTroikaPositionOffset.value.y);\n setTexData(startIndex + 30, uTroikaEdgeOffset.value);\n setTexData(startIndex + 31, uTroikaBlurRadius.value);\n } else {\n // Stroke properties\n setTexData(startIndex + 28, uTroikaStrokeWidth.value);\n setTexData(startIndex + 29, tempColor$1.set(uTroikaStrokeColor.value).getHex());\n setTexData(startIndex + 30, uTroikaStrokeOpacity.value);\n }\n }\n });\n material.setMatrixTexture(texture);\n\n // For the non-member-specific uniforms:\n super._prepareForRender(material);\n }\n\n sync (callback) {\n // TODO: skip members updating their geometries, just use textRenderInfo directly\n\n // Trigger sync on all members that need it\n let syncPromises = this._needsRepack ? [] : null;\n this._needsRepack = false;\n this._members.forEach((packingInfo, text) => {\n if (packingInfo.dirty || text._needsSync) {\n packingInfo.dirty = false;\n (syncPromises || (syncPromises = [])).push(new Promise(resolve => {\n if (text._needsSync) {\n text.sync(resolve);\n } else {\n resolve();\n }\n }));\n }\n });\n\n // If any needed syncing, wait for them and then repack the batched geometry\n if (syncPromises) {\n this.dispatchEvent(syncStartEvent$1);\n\n Promise.all(syncPromises).then(() => {\n const { geometry } = this;\n const batchedAttributes = geometry.attributes;\n let memberIndexes = batchedAttributes[memberIndexAttrName] && batchedAttributes[memberIndexAttrName].array || new Uint16Array(0);\n let batchedGlyphIndexes = batchedAttributes[glyphIndexAttrName] && batchedAttributes[glyphIndexAttrName].array || new Float32Array(0);\n let batchedGlyphBounds = batchedAttributes[glyphBoundsAttrName] && batchedAttributes[glyphBoundsAttrName].array || new Float32Array(0);\n\n // Initial pass to collect total glyph count and resize the arrays if needed\n let totalGlyphCount = 0;\n this._members.forEach((packingInfo, { textRenderInfo }) => {\n if (textRenderInfo) {\n totalGlyphCount += textRenderInfo.glyphAtlasIndices.length;\n this._textRenderInfo = textRenderInfo; // TODO - need this, but be smarter\n }\n });\n if (totalGlyphCount !== memberIndexes.length) {\n memberIndexes = cloneAndResize(memberIndexes, totalGlyphCount);\n batchedGlyphIndexes = cloneAndResize(batchedGlyphIndexes, totalGlyphCount);\n batchedGlyphBounds = cloneAndResize(batchedGlyphBounds, totalGlyphCount * 4);\n }\n\n // Populate batch arrays\n let memberIndex = 0;\n let glyphIndex = 0;\n this._members.forEach((packingInfo, { textRenderInfo }) => {\n if (textRenderInfo) {\n const glyphCount = textRenderInfo.glyphAtlasIndices.length;\n memberIndexes.fill(memberIndex, glyphIndex, glyphIndex + glyphCount);\n\n // TODO can skip these for members that are not dirty or shifting overall position:\n batchedGlyphIndexes.set(textRenderInfo.glyphAtlasIndices, glyphIndex, glyphIndex + glyphCount);\n batchedGlyphBounds.set(textRenderInfo.glyphBounds, glyphIndex * 4, (glyphIndex + glyphCount) * 4);\n\n glyphIndex += glyphCount;\n packingInfo.index = memberIndex++;\n }\n });\n\n // Update the geometry attributes\n geometry.updateAttributeData(memberIndexAttrName, memberIndexes, 1);\n geometry.getAttribute(memberIndexAttrName).setUsage(DynamicDrawUsage);\n geometry.updateAttributeData(glyphIndexAttrName, batchedGlyphIndexes, 1);\n geometry.updateAttributeData(glyphBoundsAttrName, batchedGlyphBounds, 4);\n\n this.updateBounds();\n\n this.dispatchEvent(syncCompleteEvent$1);\n if (callback) {\n callback();\n }\n });\n }\n }\n\n copy (source) {\n if (source instanceof BatchedText) {\n super.copy(source);\n this._members.forEach((_, text) => this.removeText(text));\n source._members.forEach((_, text) => this.addText(text));\n }\n return this;\n }\n\n dispose () {\n super.dispose();\n Object.values(this._dataTextures).forEach(tex => tex.dispose());\n }\n}\n\nfunction cloneAndResize (source, newLength) {\n const copy = new source.constructor(newLength);\n copy.set(source.subarray(0, newLength));\n return copy;\n}\n\nfunction createBatchedTextMaterial (baseMaterial) {\n const texUniformName = \"uTroikaMatricesTexture\";\n const texSizeUniformName = \"uTroikaMatricesTextureSize\";\n\n // Due to how vertexTransform gets injected, the matrix transforms must happen\n // in the base material of TextDerivedMaterial, but other transforms to its\n // shader must come after, so we sandwich it between two derivations.\n\n // Transform the vertex position\n let batchMaterial = createDerivedMaterial(baseMaterial, {\n chained: true,\n uniforms: {\n [texSizeUniformName]: { value: new Vector2() },\n [texUniformName]: { value: null }\n },\n // language=GLSL\n vertexDefs: `\n uniform highp sampler2D ${texUniformName};\n uniform vec2 ${texSizeUniformName};\n attribute float ${memberIndexAttrName};\n\n vec4 troikaBatchTexel(float offset) {\n offset += ${memberIndexAttrName} * ${floatsPerMember.toFixed(1)} / 4.0;\n float w = ${texSizeUniformName}.x;\n vec2 uv = (vec2(mod(offset, w), floor(offset / w)) + 0.5) / ${texSizeUniformName};\n return texture2D(${texUniformName}, uv);\n }\n `,\n // language=GLSL prefix=\"void main() {\" suffix=\"}\"\n vertexTransform: `\n mat4 matrix = mat4(\n troikaBatchTexel(0.0),\n troikaBatchTexel(1.0),\n troikaBatchTexel(2.0),\n troikaBatchTexel(3.0)\n );\n position.xyz = (matrix * vec4(position, 1.0)).xyz;\n `,\n });\n\n // Add the text shaders\n batchMaterial = createTextDerivedMaterial(batchMaterial);\n\n // Now make other changes to the derived text shader code\n batchMaterial = createDerivedMaterial(batchMaterial, {\n chained: true,\n uniforms: {\n uTroikaIsOutline: {value: false},\n },\n customRewriter(shaders) {\n // Convert some text shader uniforms to varyings\n const varyingUniforms = [\n 'uTroikaTotalBounds',\n 'uTroikaClipRect',\n 'uTroikaPositionOffset',\n 'uTroikaEdgeOffset',\n 'uTroikaBlurRadius',\n 'uTroikaStrokeWidth',\n 'uTroikaStrokeColor',\n 'uTroikaStrokeOpacity',\n 'uTroikaFillOpacity',\n 'uTroikaCurveRadius',\n 'diffuse'\n ];\n varyingUniforms.forEach(uniformName => {\n shaders = uniformToVarying(shaders, uniformName);\n });\n return shaders\n },\n // language=GLSL\n vertexDefs: `\n uniform bool uTroikaIsOutline;\n vec3 troikaFloatToColor(float v) {\n return mod(floor(vec3(v / 65536.0, v / 256.0, v)), 256.0) / 256.0;\n }\n `,\n // language=GLSL prefix=\"void main() {\" suffix=\"}\"\n vertexTransform: `\n uTroikaTotalBounds = troikaBatchTexel(4.0);\n uTroikaClipRect = troikaBatchTexel(5.0);\n \n vec4 data = troikaBatchTexel(6.0);\n diffuse = troikaFloatToColor(data.x);\n uTroikaFillOpacity = data.y;\n uTroikaCurveRadius = data.z;\n \n data = troikaBatchTexel(7.0);\n if (uTroikaIsOutline) {\n if (data == vec4(0.0)) { // degenerate if zero outline\n position = vec3(0.0);\n } else {\n uTroikaPositionOffset = data.xy;\n uTroikaEdgeOffset = data.z;\n uTroikaBlurRadius = data.w;\n }\n } else {\n uTroikaStrokeWidth = data.x;\n uTroikaStrokeColor = troikaFloatToColor(data.y);\n uTroikaStrokeOpacity = data.z;\n }\n `,\n });\n\n batchMaterial.setMatrixTexture = (texture) => {\n batchMaterial.uniforms[texUniformName].value = texture;\n batchMaterial.uniforms[texSizeUniformName].value.set(texture.image.width, texture.image.height);\n };\n return batchMaterial;\n}\n\n/**\n * Turn a uniform into a varying/writeable value.\n * - If the uniform was used in the fragment shader, it will become a varying in both shaders.\n * - If the uniform was only used in the vertex shader, it will become a writeable var.\n */\nfunction uniformToVarying({vertexShader, fragmentShader}, uniformName, varyingName = uniformName) {\n const uniformRE = new RegExp(`uniform\\\\s+(bool|float|vec[234]|mat[34])\\\\s+${uniformName}\\\\b`);\n\n let type;\n let hadFragmentUniform = false;\n fragmentShader = fragmentShader.replace(uniformRE, ($0, $1) => {\n hadFragmentUniform = true;\n return `varying ${type = $1} ${varyingName}`\n });\n\n let hadVertexUniform = false;\n vertexShader = vertexShader.replace(uniformRE, (_, $1) => {\n hadVertexUniform = true;\n return `${hadFragmentUniform ? 'varying' : ''} ${type = $1} ${varyingName}`\n });\n if (!hadVertexUniform) {\n vertexShader = `${hadFragmentUniform ? 'varying' : ''} ${type} ${varyingName};\\n${vertexShader}`;\n }\n return {vertexShader, fragmentShader}\n}\n\n//=== Utility functions for dealing with carets and selection ranges ===//\n\n/**\n * @typedef {object} TextCaret\n * @property {number} x - x position of the caret\n * @property {number} y - y position of the caret's bottom\n * @property {number} height - height of the caret\n * @property {number} charIndex - the index in the original input string of this caret's target\n * character; the caret will be for the position _before_ that character.\n */\n\n/**\n * Given a local x/y coordinate in the text block plane, find the nearest caret position.\n * @param {TroikaTextRenderInfo} textRenderInfo - a result object from TextBuilder#getTextRenderInfo\n * @param {number} x\n * @param {number} y\n * @return {TextCaret | null}\n */\nfunction getCaretAtPoint(textRenderInfo, x, y) {\n let closestCaret = null;\n const rows = groupCaretsByRow(textRenderInfo);\n\n // Find nearest row by y first\n let closestRow = null;\n rows.forEach(row => {\n if (!closestRow || Math.abs(y - (row.top + row.bottom) / 2) < Math.abs(y - (closestRow.top + closestRow.bottom) / 2)) {\n closestRow = row;\n }\n });\n\n // Then find closest caret by x within that row\n closestRow.carets.forEach(caret => {\n if (!closestCaret || Math.abs(x - caret.x) < Math.abs(x - closestCaret.x)) {\n closestCaret = caret;\n }\n });\n return closestCaret\n}\n\n\nconst _rectsCache = new WeakMap();\n\n/**\n * Given start and end character indexes, return a list of rectangles covering all the\n * characters within that selection.\n * @param {TroikaTextRenderInfo} textRenderInfo\n * @param {number} start - index of the first char in the selection\n * @param {number} end - index of the first char after the selection\n * @return {Array<{left, top, right, bottom}> | null}\n */\nfunction getSelectionRects(textRenderInfo, start, end) {\n let rects;\n if (textRenderInfo) {\n // Check cache - textRenderInfo is frozen so it's safe to cache based on it\n let prevResult = _rectsCache.get(textRenderInfo);\n if (prevResult && prevResult.start === start && prevResult.end === end) {\n return prevResult.rects\n }\n\n const {caretPositions} = textRenderInfo;\n\n // Normalize\n if (end < start) {\n const s = start;\n start = end;\n end = s;\n }\n start = Math.max(start, 0);\n end = Math.min(end, caretPositions.length + 1);\n\n // Build list of rects, expanding the current rect for all characters in a run and starting\n // a new rect whenever reaching a new line or a new bidi direction\n rects = [];\n let currentRect = null;\n for (let i = start; i < end; i++) {\n const x1 = caretPositions[i * 4];\n const x2 = caretPositions[i * 4 + 1];\n const left = Math.min(x1, x2);\n const right = Math.max(x1, x2);\n const bottom = caretPositions[i * 4 + 2];\n const top = caretPositions[i * 4 + 3];\n if (!currentRect || bottom !== currentRect.bottom || top !== currentRect.top || left > currentRect.right || right < currentRect.left) {\n currentRect = {\n left: Infinity,\n right: -Infinity,\n bottom,\n top,\n };\n rects.push(currentRect);\n }\n currentRect.left = Math.min(left, currentRect.left);\n currentRect.right = Math.max(right, currentRect.right);\n }\n\n // Merge any overlapping rects, e.g. those formed by adjacent bidi runs\n rects.sort((a, b) => b.bottom - a.bottom || a.left - b.left);\n for (let i = rects.length - 1; i-- > 0;) {\n const rectA = rects[i];\n const rectB = rects[i + 1];\n if (rectA.bottom === rectB.bottom && rectA.top === rectB.top && rectA.left <= rectB.right && rectA.right >= rectB.left) {\n rectB.left = Math.min(rectB.left, rectA.left);\n rectB.right = Math.max(rectB.right, rectA.right);\n rects.splice(i, 1);\n }\n }\n\n _rectsCache.set(textRenderInfo, {start, end, rects});\n }\n return rects\n}\n\nconst _caretsByRowCache = new WeakMap();\n\n/**\n * Group a set of carets by row of text, caching the result. A single row of text may contain carets of\n * differing positions/heights if it has multiple fonts, and they may overlap slightly across rows, so this\n * uses an assumption of \"at least overlapping by half\" to put them in the same row.\n * @return Array<{bottom: number, top: number, carets: TextCaret[]}>\n */\nfunction groupCaretsByRow(textRenderInfo) {\n // textRenderInfo is frozen so it's safe to cache based on it\n let rows = _caretsByRowCache.get(textRenderInfo);\n if (!rows) {\n rows = [];\n const {caretPositions} = textRenderInfo;\n let curRow;\n\n const visitCaret = (x, bottom, top, charIndex) => {\n // new row if not overlapping by at least half\n if (!curRow || (top < (curRow.top + curRow.bottom) / 2)) {\n rows.push(curRow = {bottom, top, carets: []});\n }\n // expand vertical limits if necessary\n if (top > curRow.top) curRow.top = top;\n if (bottom < curRow.bottom) curRow.bottom = bottom;\n curRow.carets.push({\n x,\n y: bottom,\n height: top - bottom,\n charIndex,\n });\n };\n\n let i = 0;\n for (; i < caretPositions.length; i += 4) {\n visitCaret(caretPositions[i], caretPositions[i + 2], caretPositions[i + 3], i / 4);\n }\n // Add one more caret after the final char\n visitCaret(caretPositions[i - 3], caretPositions[i - 2], caretPositions[i - 1], i / 4);\n }\n _caretsByRowCache.set(textRenderInfo, rows);\n return rows\n}\n\nexport { BatchedText, GlyphsGeometry, Text, configureTextBuilder, createTextDerivedMaterial, dumpSDFTextures, fontResolverWorkerModule, getCaretAtPoint, getSelectionRects, getTextRenderInfo, preloadFont, typesetterWorkerModule };\n","/**\n * Main content for the worker that handles the loading and execution of\n * modules within it.\n */\nfunction workerBootstrap() {\n var modules = Object.create(null);\n\n // Handle messages for registering a module\n function registerModule(ref, callback) {\n var id = ref.id;\n var name = ref.name;\n var dependencies = ref.dependencies; if ( dependencies === void 0 ) dependencies = [];\n var init = ref.init; if ( init === void 0 ) init = function(){};\n var getTransferables = ref.getTransferables; if ( getTransferables === void 0 ) getTransferables = null;\n\n // Only register once\n if (modules[id]) { return }\n\n try {\n // If any dependencies are modules, ensure they're registered and grab their value\n dependencies = dependencies.map(function (dep) {\n if (dep && dep.isWorkerModule) {\n registerModule(dep, function (depResult) {\n if (depResult instanceof Error) { throw depResult }\n });\n dep = modules[dep.id].value;\n }\n return dep\n });\n\n // Rehydrate functions\n init = rehydrate((\"<\" + name + \">.init\"), init);\n if (getTransferables) {\n getTransferables = rehydrate((\"<\" + name + \">.getTransferables\"), getTransferables);\n }\n\n // Initialize the module and store its value\n var value = null;\n if (typeof init === 'function') {\n value = init.apply(void 0, dependencies);\n } else {\n console.error('worker module init function failed to rehydrate');\n }\n modules[id] = {\n id: id,\n value: value,\n getTransferables: getTransferables\n };\n callback(value);\n } catch(err) {\n if (!(err && err.noLog)) {\n console.error(err);\n }\n callback(err);\n }\n }\n\n // Handle messages for calling a registered module's result function\n function callModule(ref, callback) {\n var ref$1;\n\n var id = ref.id;\n var args = ref.args;\n if (!modules[id] || typeof modules[id].value !== 'function') {\n callback(new Error((\"Worker module \" + id + \": not found or its 'init' did not return a function\")));\n }\n try {\n var result = (ref$1 = modules[id]).value.apply(ref$1, args);\n if (result && typeof result.then === 'function') {\n result.then(handleResult, function (rej) { return callback(rej instanceof Error ? rej : new Error('' + rej)); });\n } else {\n handleResult(result);\n }\n } catch(err) {\n callback(err);\n }\n function handleResult(result) {\n try {\n var tx = modules[id].getTransferables && modules[id].getTransferables(result);\n if (!tx || !Array.isArray(tx) || !tx.length) {\n tx = undefined; //postMessage is very picky about not passing null or empty transferables\n }\n callback(result, tx);\n } catch(err) {\n console.error(err);\n callback(err);\n }\n }\n }\n\n function rehydrate(name, str) {\n var result = void 0;\n self.troikaDefine = function (r) { return result = r; };\n var url = URL.createObjectURL(\n new Blob(\n [(\"/** \" + (name.replace(/\\*/g, '')) + \" **/\\n\\ntroikaDefine(\\n\" + str + \"\\n)\")],\n {type: 'application/javascript'}\n )\n );\n try {\n importScripts(url);\n } catch(err) {\n console.error(err);\n }\n URL.revokeObjectURL(url);\n delete self.troikaDefine;\n return result\n }\n\n // Handler for all messages within the worker\n self.addEventListener('message', function (e) {\n var ref = e.data;\n var messageId = ref.messageId;\n var action = ref.action;\n var data = ref.data;\n try {\n // Module registration\n if (action === 'registerModule') {\n registerModule(data, function (result) {\n if (result instanceof Error) {\n postMessage({\n messageId: messageId,\n success: false,\n error: result.message\n });\n } else {\n postMessage({\n messageId: messageId,\n success: true,\n result: {isCallable: typeof result === 'function'}\n });\n }\n });\n }\n // Invocation\n if (action === 'callModule') {\n callModule(data, function (result, transferables) {\n if (result instanceof Error) {\n postMessage({\n messageId: messageId,\n success: false,\n error: result.message\n });\n } else {\n postMessage({\n messageId: messageId,\n success: true,\n result: result\n }, transferables || undefined);\n }\n });\n }\n } catch(err) {\n postMessage({\n messageId: messageId,\n success: false,\n error: err.stack\n });\n }\n });\n}\n\n/**\n * Fallback for `defineWorkerModule` that behaves identically but runs in the main\n * thread, for when the execution environment doesn't support web workers or they\n * are disallowed due to e.g. CSP security restrictions.\n */\nfunction defineMainThreadModule(options) {\n var moduleFunc = function() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n return moduleFunc._getInitResult().then(function (initResult) {\n if (typeof initResult === 'function') {\n return initResult.apply(void 0, args)\n } else {\n throw new Error('Worker module function was called but `init` did not return a callable function')\n }\n })\n };\n moduleFunc._getInitResult = function() {\n // We can ignore getTransferables in main thread. TODO workerId?\n var dependencies = options.dependencies;\n var init = options.init;\n\n // Resolve dependencies\n dependencies = Array.isArray(dependencies) ? dependencies.map(function (dep) {\n if (dep) {\n // If it's a worker module, use its main thread impl\n dep = dep.onMainThread || dep;\n // If it's a main thread worker module, use its init return value\n if (dep._getInitResult) {\n dep = dep._getInitResult();\n }\n }\n return dep\n }) : [];\n\n // Invoke init with the resolved dependencies\n var initPromise = Promise.all(dependencies).then(function (deps) {\n return init.apply(null, deps)\n });\n\n // Cache the resolved promise for subsequent calls\n moduleFunc._getInitResult = function () { return initPromise; };\n\n return initPromise\n };\n return moduleFunc\n}\n\nvar supportsWorkers = function () {\n var supported = false;\n\n // Only attempt worker initialization in browsers; elsewhere it would just be\n // noise e.g. loading into a Node environment for SSR.\n if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {\n try {\n // TODO additional checks for things like importScripts within the worker?\n // Would need to be an async check.\n var worker = new Worker(\n URL.createObjectURL(new Blob([''], { type: 'application/javascript' }))\n );\n worker.terminate();\n supported = true;\n } catch (err) {\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'test') ; else {\n console.log(\n (\"Troika createWorkerModule: web workers not allowed; falling back to main thread execution. Cause: [\" + (err.message) + \"]\")\n );\n }\n }\n }\n\n // Cached result\n supportsWorkers = function () { return supported; };\n return supported\n};\n\nvar _workerModuleId = 0;\nvar _messageId = 0;\nvar _allowInitAsString = false;\nvar workers = Object.create(null);\nvar registeredModules = Object.create(null); //workerId -> Set<unregisterFn>\nvar openRequests = Object.create(null);\n\n\n/**\n * Define a module of code that will be executed with a web worker. This provides a simple\n * interface for moving chunks of logic off the main thread, and managing their dependencies\n * among one another.\n *\n * @param {object} options\n * @param {function} options.init\n * @param {array} [options.dependencies]\n * @param {function} [options.getTransferables]\n * @param {string} [options.name]\n * @param {string} [options.workerId]\n * @return {function(...[*]): {then}}\n */\nfunction defineWorkerModule(options) {\n if ((!options || typeof options.init !== 'function') && !_allowInitAsString) {\n throw new Error('requires `options.init` function')\n }\n var dependencies = options.dependencies;\n var init = options.init;\n var getTransferables = options.getTransferables;\n var workerId = options.workerId;\n\n var onMainThread = defineMainThreadModule(options);\n\n if (workerId == null) {\n workerId = '#default';\n }\n var id = \"workerModule\" + (++_workerModuleId);\n var name = options.name || id;\n var registrationPromise = null;\n\n dependencies = dependencies && dependencies.map(function (dep) {\n // Wrap raw functions as worker modules with no dependencies\n if (typeof dep === 'function' && !dep.workerModuleData) {\n _allowInitAsString = true;\n dep = defineWorkerModule({\n workerId: workerId,\n name: (\"<\" + name + \"> function dependency: \" + (dep.name)),\n init: (\"function(){return (\\n\" + (stringifyFunction(dep)) + \"\\n)}\")\n });\n _allowInitAsString = false;\n }\n // Grab postable data for worker modules\n if (dep && dep.workerModuleData) {\n dep = dep.workerModuleData;\n }\n return dep\n });\n\n function moduleFunc() {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n if (!supportsWorkers()) {\n return onMainThread.apply(void 0, args)\n }\n\n // Register this module if needed\n if (!registrationPromise) {\n registrationPromise = callWorker(workerId,'registerModule', moduleFunc.workerModuleData);\n var unregister = function () {\n registrationPromise = null;\n registeredModules[workerId].delete(unregister);\n }\n ;(registeredModules[workerId] || (registeredModules[workerId] = new Set())).add(unregister);\n }\n\n // Invoke the module, returning a promise\n return registrationPromise.then(function (ref) {\n var isCallable = ref.isCallable;\n\n if (isCallable) {\n return callWorker(workerId,'callModule', {id: id, args: args})\n } else {\n throw new Error('Worker module function was called but `init` did not return a callable function')\n }\n })\n }\n moduleFunc.workerModuleData = {\n isWorkerModule: true,\n id: id,\n name: name,\n dependencies: dependencies,\n init: stringifyFunction(init),\n getTransferables: getTransferables && stringifyFunction(getTransferables)\n };\n\n moduleFunc.onMainThread = onMainThread;\n\n return moduleFunc\n}\n\n/**\n * Terminate an active Worker by a workerId that was passed to defineWorkerModule.\n * This only terminates the Worker itself; the worker module will remain available\n * and if you call it again its Worker will be respawned.\n * @param {string} workerId\n */\nfunction terminateWorker(workerId) {\n // Unregister all modules that were registered in that worker\n if (registeredModules[workerId]) {\n registeredModules[workerId].forEach(function (unregister) {\n unregister();\n });\n }\n // Terminate the Worker object\n if (workers[workerId]) {\n workers[workerId].terminate();\n delete workers[workerId];\n }\n}\n\n/**\n * Stringifies a function into a form that can be deserialized in the worker\n * @param fn\n */\nfunction stringifyFunction(fn) {\n var str = fn.toString();\n // If it was defined in object method/property format, it needs to be modified\n if (!/^function/.test(str) && /^\\w+\\s*\\(/.test(str)) {\n str = 'function ' + str;\n }\n return str\n}\n\n\nfunction getWorker(workerId) {\n var worker = workers[workerId];\n if (!worker) {\n // Bootstrap the worker's content\n var bootstrap = stringifyFunction(workerBootstrap);\n\n // Create the worker from the bootstrap function content\n worker = workers[workerId] = new Worker(\n URL.createObjectURL(\n new Blob(\n [(\"/** Worker Module Bootstrap: \" + (workerId.replace(/\\*/g, '')) + \" **/\\n\\n;(\" + bootstrap + \")()\")],\n {type: 'application/javascript'}\n )\n )\n );\n\n // Single handler for response messages from the worker\n worker.onmessage = function (e) {\n var response = e.data;\n var msgId = response.messageId;\n var callback = openRequests[msgId];\n if (!callback) {\n throw new Error('WorkerModule response with empty or unknown messageId')\n }\n delete openRequests[msgId];\n callback(response);\n };\n }\n return worker\n}\n\n// Issue a call to the worker with a callback to handle the response\nfunction callWorker(workerId, action, data) {\n return new Promise(function (resolve, reject) {\n var messageId = ++_messageId;\n openRequests[messageId] = function (response) {\n if (response.success) {\n resolve(response.result);\n } else {\n reject(new Error((\"Error in worker \" + action + \" call: \" + (response.error))));\n }\n };\n getWorker(workerId).postMessage({\n messageId: messageId,\n action: action,\n data: data\n });\n })\n}\n\nexport { defineWorkerModule, stringifyFunction, terminateWorker };\n","function SDFGenerator() {\nvar exports = (function (exports) {\n\n /**\n * Find the point on a quadratic bezier curve at t where t is in the range [0, 1]\n */\n function pointOnQuadraticBezier (x0, y0, x1, y1, x2, y2, t, pointOut) {\n var t2 = 1 - t;\n pointOut.x = t2 * t2 * x0 + 2 * t2 * t * x1 + t * t * x2;\n pointOut.y = t2 * t2 * y0 + 2 * t2 * t * y1 + t * t * y2;\n }\n\n /**\n * Find the point on a cubic bezier curve at t where t is in the range [0, 1]\n */\n function pointOnCubicBezier (x0, y0, x1, y1, x2, y2, x3, y3, t, pointOut) {\n var t2 = 1 - t;\n pointOut.x = t2 * t2 * t2 * x0 + 3 * t2 * t2 * t * x1 + 3 * t2 * t * t * x2 + t * t * t * x3;\n pointOut.y = t2 * t2 * t2 * y0 + 3 * t2 * t2 * t * y1 + 3 * t2 * t * t * y2 + t * t * t * y3;\n }\n\n /**\n * Parse a path string into its constituent line/curve commands, invoking a callback for each.\n * @param {string} pathString - An SVG-like path string to parse; should only contain commands: M/L/Q/C/Z\n * @param {function(\n * command: 'L'|'Q'|'C',\n * startX: number,\n * startY: number,\n * endX: number,\n * endY: number,\n * ctrl1X?: number,\n * ctrl1Y?: number,\n * ctrl2X?: number,\n * ctrl2Y?: number\n * )} commandCallback - A callback function that will be called once for each parsed path command, passing the\n * command identifier (only L/Q/C commands) and its numeric arguments.\n */\n function forEachPathCommand(pathString, commandCallback) {\n var segmentRE = /([MLQCZ])([^MLQCZ]*)/g;\n var match, firstX, firstY, prevX, prevY;\n while ((match = segmentRE.exec(pathString))) {\n var args = match[2]\n .replace(/^\\s*|\\s*$/g, '')\n .split(/[,\\s]+/)\n .map(function (v) { return parseFloat(v); });\n switch (match[1]) {\n case 'M':\n prevX = firstX = args[0];\n prevY = firstY = args[1];\n break\n case 'L':\n if (args[0] !== prevX || args[1] !== prevY) { // yup, some fonts have zero-length line commands\n commandCallback('L', prevX, prevY, (prevX = args[0]), (prevY = args[1]));\n }\n break\n case 'Q': {\n commandCallback('Q', prevX, prevY, (prevX = args[2]), (prevY = args[3]), args[0], args[1]);\n break\n }\n case 'C': {\n commandCallback('C', prevX, prevY, (prevX = args[4]), (prevY = args[5]), args[0], args[1], args[2], args[3]);\n break\n }\n case 'Z':\n if (prevX !== firstX || prevY !== firstY) {\n commandCallback('L', prevX, prevY, firstX, firstY);\n }\n break\n }\n }\n }\n\n /**\n * Convert a path string to a series of straight line segments\n * @param {string} pathString - An SVG-like path string to parse; should only contain commands: M/L/Q/C/Z\n * @param {function(x1:number, y1:number, x2:number, y2:number)} segmentCallback - A callback\n * function that will be called once for every line segment\n * @param {number} [curvePoints] - How many straight line segments to use when approximating a\n * bezier curve in the path. Defaults to 16.\n */\n function pathToLineSegments (pathString, segmentCallback, curvePoints) {\n if ( curvePoints === void 0 ) curvePoints = 16;\n\n var tempPoint = { x: 0, y: 0 };\n forEachPathCommand(pathString, function (command, startX, startY, endX, endY, ctrl1X, ctrl1Y, ctrl2X, ctrl2Y) {\n switch (command) {\n case 'L':\n segmentCallback(startX, startY, endX, endY);\n break\n case 'Q': {\n var prevCurveX = startX;\n var prevCurveY = startY;\n for (var i = 1; i < curvePoints; i++) {\n pointOnQuadraticBezier(\n startX, startY,\n ctrl1X, ctrl1Y,\n endX, endY,\n i / (curvePoints - 1),\n tempPoint\n );\n segmentCallback(prevCurveX, prevCurveY, tempPoint.x, tempPoint.y);\n prevCurveX = tempPoint.x;\n prevCurveY = tempPoint.y;\n }\n break\n }\n case 'C': {\n var prevCurveX$1 = startX;\n var prevCurveY$1 = startY;\n for (var i$1 = 1; i$1 < curvePoints; i$1++) {\n pointOnCubicBezier(\n startX, startY,\n ctrl1X, ctrl1Y,\n ctrl2X, ctrl2Y,\n endX, endY,\n i$1 / (curvePoints - 1),\n tempPoint\n );\n segmentCallback(prevCurveX$1, prevCurveY$1, tempPoint.x, tempPoint.y);\n prevCurveX$1 = tempPoint.x;\n prevCurveY$1 = tempPoint.y;\n }\n break\n }\n }\n });\n }\n\n var viewportQuadVertex = \"precision highp float;attribute vec2 aUV;varying vec2 vUV;void main(){vUV=aUV;gl_Position=vec4(mix(vec2(-1.0),vec2(1.0),aUV),0.0,1.0);}\";\n\n var copyTexFragment = \"precision highp float;uniform sampler2D tex;varying vec2 vUV;void main(){gl_FragColor=texture2D(tex,vUV);}\";\n\n var cache = new WeakMap();\n\n var glContextParams = {\n premultipliedAlpha: false,\n preserveDrawingBuffer: true,\n antialias: false,\n depth: false,\n };\n\n /**\n * This is a little helper library for WebGL. It assists with state management for a GL context.\n * It's pretty tightly wrapped to the needs of this package, not very general-purpose.\n *\n * @param { WebGLRenderingContext | HTMLCanvasElement | OffscreenCanvas } glOrCanvas - the GL context to wrap\n * @param { ({gl, getExtension, withProgram, withTexture, withTextureFramebuffer, handleContextLoss}) => void } callback\n */\n function withWebGLContext (glOrCanvas, callback) {\n var gl = glOrCanvas.getContext ? glOrCanvas.getContext('webgl', glContextParams) : glOrCanvas;\n var wrapper = cache.get(gl);\n if (!wrapper) {\n var isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext;\n var extensions = {};\n var programs = {};\n var textures = {};\n var textureUnit = -1;\n var framebufferStack = [];\n\n gl.canvas.addEventListener('webglcontextlost', function (e) {\n handleContextLoss();\n e.preventDefault();\n }, false);\n\n function getExtension (name) {\n var ext = extensions[name];\n if (!ext) {\n ext = extensions[name] = gl.getExtension(name);\n if (!ext) {\n throw new Error((name + \" not supported\"))\n }\n }\n return ext\n }\n\n function compileShader (src, type) {\n var shader = gl.createShader(type);\n gl.shaderSource(shader, src);\n gl.compileShader(shader);\n // const status = gl.getShaderParameter(shader, gl.COMPILE_STATUS)\n // if (!status && !gl.isContextLost()) {\n // throw new Error(gl.getShaderInfoLog(shader).trim())\n // }\n return shader\n }\n\n function withProgram (name, vert, frag, func) {\n if (!programs[name]) {\n var attributes = {};\n var uniforms = {};\n var program = gl.createProgram();\n gl.attachShader(program, compileShader(vert, gl.VERTEX_SHADER));\n gl.attachShader(program, compileShader(frag, gl.FRAGMENT_SHADER));\n gl.linkProgram(program);\n\n programs[name] = {\n program: program,\n transaction: function transaction (func) {\n gl.useProgram(program);\n func({\n setUniform: function setUniform (type, name) {\n var values = [], len = arguments.length - 2;\n while ( len-- > 0 ) values[ len ] = arguments[ len + 2 ];\n\n var uniformLoc = uniforms[name] || (uniforms[name] = gl.getUniformLocation(program, name));\n gl[(\"uniform\" + type)].apply(gl, [ uniformLoc ].concat( values ));\n },\n\n setAttribute: function setAttribute (name, size, usage, instancingDivisor, data) {\n var attr = attributes[name];\n if (!attr) {\n attr = attributes[name] = {\n buf: gl.createBuffer(), // TODO should we destroy our buffers?\n loc: gl.getAttribLocation(program, name),\n data: null\n };\n }\n gl.bindBuffer(gl.ARRAY_BUFFER, attr.buf);\n gl.vertexAttribPointer(attr.loc, size, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray(attr.loc);\n if (isWebGL2) {\n gl.vertexAttribDivisor(attr.loc, instancingDivisor);\n } else {\n getExtension('ANGLE_instanced_arrays').vertexAttribDivisorANGLE(attr.loc, instancingDivisor);\n }\n if (data !== attr.data) {\n gl.bufferData(gl.ARRAY_BUFFER, data, usage);\n attr.data = data;\n }\n }\n });\n }\n };\n }\n\n programs[name].transaction(func);\n }\n\n function withTexture (name, func) {\n textureUnit++;\n try {\n gl.activeTexture(gl.TEXTURE0 + textureUnit);\n var texture = textures[name];\n if (!texture) {\n texture = textures[name] = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n }\n gl.bindTexture(gl.TEXTURE_2D, texture);\n func(texture, textureUnit);\n } finally {\n textureUnit--;\n }\n }\n\n function withTextureFramebuffer (texture, textureUnit, func) {\n var framebuffer = gl.createFramebuffer();\n framebufferStack.push(framebuffer);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.activeTexture(gl.TEXTURE0 + textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n try {\n func(framebuffer);\n } finally {\n gl.deleteFramebuffer(framebuffer);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferStack[--framebufferStack.length - 1] || null);\n }\n }\n\n function handleContextLoss () {\n extensions = {};\n programs = {};\n textures = {};\n textureUnit = -1;\n framebufferStack.length = 0;\n }\n\n cache.set(gl, wrapper = {\n gl: gl,\n isWebGL2: isWebGL2,\n getExtension: getExtension,\n withProgram: withProgram,\n withTexture: withTexture,\n withTextureFramebuffer: withTextureFramebuffer,\n handleContextLoss: handleContextLoss,\n });\n }\n callback(wrapper);\n }\n\n\n function renderImageData(glOrCanvas, imageData, x, y, width, height, channels, framebuffer) {\n if ( channels === void 0 ) channels = 15;\n if ( framebuffer === void 0 ) framebuffer = null;\n\n withWebGLContext(glOrCanvas, function (ref) {\n var gl = ref.gl;\n var withProgram = ref.withProgram;\n var withTexture = ref.withTexture;\n\n withTexture('copy', function (tex, texUnit) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, imageData);\n withProgram('copy', viewportQuadVertex, copyTexFragment, function (ref) {\n var setUniform = ref.setUniform;\n var setAttribute = ref.setAttribute;\n\n setAttribute('aUV', 2, gl.STATIC_DRAW, 0, new Float32Array([0, 0, 2, 0, 0, 2]));\n setUniform('1i', 'image', texUnit);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer || null);\n gl.disable(gl.BLEND);\n gl.colorMask(channels & 8, channels & 4, channels & 2, channels & 1);\n gl.viewport(x, y, width, height);\n gl.scissor(x, y, width, height);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n });\n });\n });\n }\n\n /**\n * Resizing a canvas clears its contents; this utility copies the previous contents over.\n * @param canvas\n * @param newWidth\n * @param newHeight\n */\n function resizeWebGLCanvasWithoutClearing(canvas, newWidth, newHeight) {\n var width = canvas.width;\n var height = canvas.height;\n withWebGLContext(canvas, function (ref) {\n var gl = ref.gl;\n\n var data = new Uint8Array(width * height * 4);\n gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, data);\n canvas.width = newWidth;\n canvas.height = newHeight;\n renderImageData(gl, data, 0, 0, width, height);\n });\n }\n\n var webglUtils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n withWebGLContext: withWebGLContext,\n renderImageData: renderImageData,\n resizeWebGLCanvasWithoutClearing: resizeWebGLCanvasWithoutClearing\n });\n\n function generate$2 (sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n\n var textureData = new Uint8Array(sdfWidth * sdfHeight);\n\n var viewBoxWidth = viewBox[2] - viewBox[0];\n var viewBoxHeight = viewBox[3] - viewBox[1];\n\n // Decompose all paths into straight line segments and add them to an index\n var segments = [];\n pathToLineSegments(path, function (x1, y1, x2, y2) {\n segments.push({\n x1: x1, y1: y1, x2: x2, y2: y2,\n minX: Math.min(x1, x2),\n minY: Math.min(y1, y2),\n maxX: Math.max(x1, x2),\n maxY: Math.max(y1, y2)\n });\n });\n\n // Sort segments by maxX, this will let us short-circuit some loops below\n segments.sort(function (a, b) { return a.maxX - b.maxX; });\n\n // For each target SDF texel, find the distance from its center to its nearest line segment,\n // map that distance to an alpha value, and write that alpha to the texel\n for (var sdfX = 0; sdfX < sdfWidth; sdfX++) {\n for (var sdfY = 0; sdfY < sdfHeight; sdfY++) {\n var signedDist = findNearestSignedDistance(\n viewBox[0] + viewBoxWidth * (sdfX + 0.5) / sdfWidth,\n viewBox[1] + viewBoxHeight * (sdfY + 0.5) / sdfHeight\n );\n\n // Use an exponential scale to ensure the texels very near the glyph path have adequate\n // precision, while allowing the distance field to cover the entire texture, given that\n // there are only 8 bits available. Formula visualized: https://www.desmos.com/calculator/uiaq5aqiam\n var alpha = Math.pow((1 - Math.abs(signedDist) / maxDistance), sdfExponent) / 2;\n if (signedDist < 0) {\n alpha = 1 - alpha;\n }\n\n alpha = Math.max(0, Math.min(255, Math.round(alpha * 255))); //clamp\n textureData[sdfY * sdfWidth + sdfX] = alpha;\n }\n }\n\n return textureData\n\n /**\n * For a given x/y, search the index for the closest line segment and return\n * its signed distance. Negative = inside, positive = outside, zero = on edge\n * @param x\n * @param y\n * @returns {number}\n */\n function findNearestSignedDistance (x, y) {\n var closestDistSq = Infinity;\n var closestDist = Infinity;\n\n for (var i = segments.length; i--;) {\n var seg = segments[i];\n if (seg.maxX + closestDist <= x) { break } //sorting by maxX means no more can be closer, so we can short-circuit\n if (x + closestDist > seg.minX && y - closestDist < seg.maxY && y + closestDist > seg.minY) {\n var distSq = absSquareDistanceToLineSegment(x, y, seg.x1, seg.y1, seg.x2, seg.y2);\n if (distSq < closestDistSq) {\n closestDistSq = distSq;\n closestDist = Math.sqrt(closestDistSq);\n }\n }\n }\n\n // Flip to negative distance if inside the poly\n if (isPointInPoly(x, y)) {\n closestDist = -closestDist;\n }\n return closestDist\n }\n\n /**\n * Determine whether the given point lies inside or outside the glyph. Uses a simple\n * winding-number ray casting algorithm using a ray pointing east from the point.\n */\n function isPointInPoly (x, y) {\n var winding = 0;\n for (var i = segments.length; i--;) {\n var seg = segments[i];\n if (seg.maxX <= x) { break } //sorting by maxX means no more can cross, so we can short-circuit\n var intersects = ((seg.y1 > y) !== (seg.y2 > y)) && (x < (seg.x2 - seg.x1) * (y - seg.y1) / (seg.y2 - seg.y1) + seg.x1);\n if (intersects) {\n winding += seg.y1 < seg.y2 ? 1 : -1;\n }\n }\n return winding !== 0\n }\n }\n\n function generateIntoCanvas$2(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, canvas, x, y, channel) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n generateIntoFramebuffer$1(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, canvas, null, x, y, channel);\n }\n\n function generateIntoFramebuffer$1 (sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, glOrCanvas, framebuffer, x, y, channel) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n var data = generate$2(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent);\n // Expand single-channel data to rbga\n var rgbaData = new Uint8Array(data.length * 4);\n for (var i = 0; i < data.length; i++) {\n rgbaData[i * 4 + channel] = data[i];\n }\n renderImageData(glOrCanvas, rgbaData, x, y, sdfWidth, sdfHeight, 1 << (3 - channel), framebuffer);\n }\n\n /**\n * Find the absolute distance from a point to a line segment at closest approach\n */\n function absSquareDistanceToLineSegment (x, y, lineX0, lineY0, lineX1, lineY1) {\n var ldx = lineX1 - lineX0;\n var ldy = lineY1 - lineY0;\n var lengthSq = ldx * ldx + ldy * ldy;\n var t = lengthSq ? Math.max(0, Math.min(1, ((x - lineX0) * ldx + (y - lineY0) * ldy) / lengthSq)) : 0;\n var dx = x - (lineX0 + t * ldx);\n var dy = y - (lineY0 + t * ldy);\n return dx * dx + dy * dy\n }\n\n var javascript = /*#__PURE__*/Object.freeze({\n __proto__: null,\n generate: generate$2,\n generateIntoCanvas: generateIntoCanvas$2,\n generateIntoFramebuffer: generateIntoFramebuffer$1\n });\n\n var mainVertex = \"precision highp float;uniform vec4 uGlyphBounds;attribute vec2 aUV;attribute vec4 aLineSegment;varying vec4 vLineSegment;varying vec2 vGlyphXY;void main(){vLineSegment=aLineSegment;vGlyphXY=mix(uGlyphBounds.xy,uGlyphBounds.zw,aUV);gl_Position=vec4(mix(vec2(-1.0),vec2(1.0),aUV),0.0,1.0);}\";\n\n var mainFragment = \"precision highp float;uniform vec4 uGlyphBounds;uniform float uMaxDistance;uniform float uExponent;varying vec4 vLineSegment;varying vec2 vGlyphXY;float absDistToSegment(vec2 point,vec2 lineA,vec2 lineB){vec2 lineDir=lineB-lineA;float lenSq=dot(lineDir,lineDir);float t=lenSq==0.0 ? 0.0 : clamp(dot(point-lineA,lineDir)/lenSq,0.0,1.0);vec2 linePt=lineA+t*lineDir;return distance(point,linePt);}void main(){vec4 seg=vLineSegment;vec2 p=vGlyphXY;float dist=absDistToSegment(p,seg.xy,seg.zw);float val=pow(1.0-clamp(dist/uMaxDistance,0.0,1.0),uExponent)*0.5;bool crossing=(seg.y>p.y!=seg.w>p.y)&&(p.x<(seg.z-seg.x)*(p.y-seg.y)/(seg.w-seg.y)+seg.x);bool crossingUp=crossing&&vLineSegment.y<vLineSegment.w;gl_FragColor=vec4(crossingUp ? 1.0/255.0 : 0.0,crossing&&!crossingUp ? 1.0/255.0 : 0.0,0.0,val);}\";\n\n var postFragment = \"precision highp float;uniform sampler2D tex;varying vec2 vUV;void main(){vec4 color=texture2D(tex,vUV);bool inside=color.r!=color.g;float val=inside ? 1.0-color.a : color.a;gl_FragColor=vec4(val);}\";\n\n // Single triangle covering viewport\n var viewportUVs = new Float32Array([0, 0, 2, 0, 0, 2]);\n\n var implicitContext = null;\n var isTestingSupport = false;\n var NULL_OBJECT = {};\n var supportByCanvas = new WeakMap(); // canvas -> bool\n\n function validateSupport (glOrCanvas) {\n if (!isTestingSupport && !isSupported(glOrCanvas)) {\n throw new Error('WebGL generation not supported')\n }\n }\n\n function generate$1 (sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, glOrCanvas) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( glOrCanvas === void 0 ) glOrCanvas = null;\n\n if (!glOrCanvas) {\n glOrCanvas = implicitContext;\n if (!glOrCanvas) {\n var canvas = typeof OffscreenCanvas === 'function'\n ? new OffscreenCanvas(1, 1)\n : typeof document !== 'undefined'\n ? document.createElement('canvas')\n : null;\n if (!canvas) {\n throw new Error('OffscreenCanvas or DOM canvas not supported')\n }\n glOrCanvas = implicitContext = canvas.getContext('webgl', { depth: false });\n }\n }\n\n validateSupport(glOrCanvas);\n\n var rgbaData = new Uint8Array(sdfWidth * sdfHeight * 4); //not Uint8ClampedArray, cuz Safari\n\n // Render into a background texture framebuffer\n withWebGLContext(glOrCanvas, function (ref) {\n var gl = ref.gl;\n var withTexture = ref.withTexture;\n var withTextureFramebuffer = ref.withTextureFramebuffer;\n\n withTexture('readable', function (texture, textureUnit) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, sdfWidth, sdfHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n\n withTextureFramebuffer(texture, textureUnit, function (framebuffer) {\n generateIntoFramebuffer(\n sdfWidth,\n sdfHeight,\n path,\n viewBox,\n maxDistance,\n sdfExponent,\n gl,\n framebuffer,\n 0,\n 0,\n 0 // red channel\n );\n gl.readPixels(0, 0, sdfWidth, sdfHeight, gl.RGBA, gl.UNSIGNED_BYTE, rgbaData);\n });\n });\n });\n\n // Throw away all but the red channel\n var data = new Uint8Array(sdfWidth * sdfHeight);\n for (var i = 0, j = 0; i < rgbaData.length; i += 4) {\n data[j++] = rgbaData[i];\n }\n\n return data\n }\n\n function generateIntoCanvas$1(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, canvas, x, y, channel) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n generateIntoFramebuffer(sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, canvas, null, x, y, channel);\n }\n\n function generateIntoFramebuffer (sdfWidth, sdfHeight, path, viewBox, maxDistance, sdfExponent, glOrCanvas, framebuffer, x, y, channel) {\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n // Verify support\n validateSupport(glOrCanvas);\n\n // Compute path segments\n var lineSegmentCoords = [];\n pathToLineSegments(path, function (x1, y1, x2, y2) {\n lineSegmentCoords.push(x1, y1, x2, y2);\n });\n lineSegmentCoords = new Float32Array(lineSegmentCoords);\n\n withWebGLContext(glOrCanvas, function (ref) {\n var gl = ref.gl;\n var isWebGL2 = ref.isWebGL2;\n var getExtension = ref.getExtension;\n var withProgram = ref.withProgram;\n var withTexture = ref.withTexture;\n var withTextureFramebuffer = ref.withTextureFramebuffer;\n var handleContextLoss = ref.handleContextLoss;\n\n withTexture('rawDistances', function (intermediateTexture, intermediateTextureUnit) {\n if (sdfWidth !== intermediateTexture._lastWidth || sdfHeight !== intermediateTexture._lastHeight) {\n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.RGBA,\n intermediateTexture._lastWidth = sdfWidth,\n intermediateTexture._lastHeight = sdfHeight,\n 0, gl.RGBA, gl.UNSIGNED_BYTE, null\n );\n }\n\n // Unsigned distance pass\n withProgram('main', mainVertex, mainFragment, function (ref) {\n var setAttribute = ref.setAttribute;\n var setUniform = ref.setUniform;\n\n // Init extensions\n var instancingExtension = !isWebGL2 && getExtension('ANGLE_instanced_arrays');\n var blendMinMaxExtension = !isWebGL2 && getExtension('EXT_blend_minmax');\n\n // Init/update attributes\n setAttribute('aUV', 2, gl.STATIC_DRAW, 0, viewportUVs);\n setAttribute('aLineSegment', 4, gl.DYNAMIC_DRAW, 1, lineSegmentCoords);\n\n // Init/update uniforms\n setUniform.apply(void 0, [ '4f', 'uGlyphBounds' ].concat( viewBox ));\n setUniform('1f', 'uMaxDistance', maxDistance);\n setUniform('1f', 'uExponent', sdfExponent);\n\n // Render initial unsigned distance / winding number info to a texture\n withTextureFramebuffer(intermediateTexture, intermediateTextureUnit, function (framebuffer) {\n gl.enable(gl.BLEND);\n gl.colorMask(true, true, true, true);\n gl.viewport(0, 0, sdfWidth, sdfHeight);\n gl.scissor(0, 0, sdfWidth, sdfHeight);\n gl.blendFunc(gl.ONE, gl.ONE);\n // Red+Green channels are incremented (FUNC_ADD) for segment-ray crossings to give a \"winding number\".\n // Alpha holds the closest (MAX) unsigned distance.\n gl.blendEquationSeparate(gl.FUNC_ADD, isWebGL2 ? gl.MAX : blendMinMaxExtension.MAX_EXT);\n gl.clear(gl.COLOR_BUFFER_BIT);\n if (isWebGL2) {\n gl.drawArraysInstanced(gl.TRIANGLES, 0, 3, lineSegmentCoords.length / 4);\n } else {\n instancingExtension.drawArraysInstancedANGLE(gl.TRIANGLES, 0, 3, lineSegmentCoords.length / 4);\n }\n // Debug\n // const debug = new Uint8Array(sdfWidth * sdfHeight * 4)\n // gl.readPixels(0, 0, sdfWidth, sdfHeight, gl.RGBA, gl.UNSIGNED_BYTE, debug)\n // console.log('intermediate texture data: ', debug)\n });\n });\n\n // Use the data stored in the texture to apply inside/outside and write to the output framebuffer rect+channel.\n withProgram('post', viewportQuadVertex, postFragment, function (program) {\n program.setAttribute('aUV', 2, gl.STATIC_DRAW, 0, viewportUVs);\n program.setUniform('1i', 'tex', intermediateTextureUnit);\n gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);\n gl.disable(gl.BLEND);\n gl.colorMask(channel === 0, channel === 1, channel === 2, channel === 3);\n gl.viewport(x, y, sdfWidth, sdfHeight);\n gl.scissor(x, y, sdfWidth, sdfHeight);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n });\n });\n\n // Handle context loss occurring during any of the above calls\n if (gl.isContextLost()) {\n handleContextLoss();\n throw new Error('webgl context lost')\n }\n });\n }\n\n function isSupported (glOrCanvas) {\n var key = (!glOrCanvas || glOrCanvas === implicitContext) ? NULL_OBJECT : (glOrCanvas.canvas || glOrCanvas);\n var supported = supportByCanvas.get(key);\n if (supported === undefined) {\n isTestingSupport = true;\n var failReason = null;\n try {\n // Since we can't detect all failure modes up front, let's just do a trial run of a\n // simple path and compare what we get back to the correct expected result. This will\n // also serve to prime the shader compilation.\n var expectedResult = [\n 97, 106, 97, 61,\n 99, 137, 118, 80,\n 80, 118, 137, 99,\n 61, 97, 106, 97\n ];\n var testResult = generate$1(\n 4,\n 4,\n 'M8,8L16,8L24,24L16,24Z',\n [0, 0, 32, 32],\n 24,\n 1,\n glOrCanvas\n );\n supported = testResult && expectedResult.length === testResult.length &&\n testResult.every(function (val, i) { return val === expectedResult[i]; });\n if (!supported) {\n failReason = 'bad trial run results';\n console.info(expectedResult, testResult);\n }\n } catch (err) {\n // TODO if it threw due to webgl context loss, should we maybe leave isSupported as null and try again later?\n supported = false;\n failReason = err.message;\n }\n if (failReason) {\n console.warn('WebGL SDF generation not supported:', failReason);\n }\n isTestingSupport = false;\n supportByCanvas.set(key, supported);\n }\n return supported\n }\n\n var webgl = /*#__PURE__*/Object.freeze({\n __proto__: null,\n generate: generate$1,\n generateIntoCanvas: generateIntoCanvas$1,\n generateIntoFramebuffer: generateIntoFramebuffer,\n isSupported: isSupported\n });\n\n /**\n * Generate an SDF texture image for a 2D path.\n *\n * @param {number} sdfWidth - width of the SDF output image in pixels.\n * @param {number} sdfHeight - height of the SDF output image in pixels.\n * @param {string} path - an SVG-like path string describing the glyph; should only contain commands: M/L/Q/C/Z.\n * @param {number[]} viewBox - [minX, minY, maxX, maxY] in font units aligning with the texture's edges.\n * @param {number} maxDistance - the maximum distance from the glyph path in font units that will be encoded; defaults\n * to half the maximum viewBox dimension.\n * @param {number} [sdfExponent] - specifies an exponent for encoding the SDF's distance values; higher exponents\n * will give greater precision nearer the glyph's path.\n * @return {Uint8Array}\n */\n function generate(\n sdfWidth,\n sdfHeight,\n path,\n viewBox,\n maxDistance,\n sdfExponent\n ) {\n if ( maxDistance === void 0 ) maxDistance = Math.max(viewBox[2] - viewBox[0], viewBox[3] - viewBox[1]) / 2;\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n\n try {\n return generate$1.apply(webgl, arguments)\n } catch(e) {\n console.info('WebGL SDF generation failed, falling back to JS', e);\n return generate$2.apply(javascript, arguments)\n }\n }\n\n /**\n * Generate an SDF texture image for a 2D path, inserting the result into a WebGL `canvas` at a given x/y position\n * and color channel. This is generally much faster than calling `generate` because it does not require reading pixels\n * back from the GPU->CPU -- the `canvas` can be used directly as a WebGL texture image, so it all stays on the GPU.\n *\n * @param {number} sdfWidth - width of the SDF output image in pixels.\n * @param {number} sdfHeight - height of the SDF output image in pixels.\n * @param {string} path - an SVG-like path string describing the glyph; should only contain commands: M/L/Q/C/Z.\n * @param {number[]} viewBox - [minX, minY, maxX, maxY] in font units aligning with the texture's edges.\n * @param {number} maxDistance - the maximum distance from the glyph path in font units that will be encoded; defaults\n * to half the maximum viewBox dimension.\n * @param {number} [sdfExponent] - specifies an exponent for encoding the SDF's distance values; higher exponents\n * will give greater precision nearer the glyph's path.\n * @param {HTMLCanvasElement|OffscreenCanvas} canvas - a WebGL-enabled canvas into which the SDF will be rendered.\n * Only the relevant rect/channel will be modified, the rest will be preserved. To avoid unpredictable results\n * due to shared GL context state, this canvas should be dedicated to use by this library alone.\n * @param {number} x - the x position at which to render the SDF.\n * @param {number} y - the y position at which to render the SDF.\n * @param {number} channel - the color channel index (0-4) into which the SDF will be rendered.\n * @return {Uint8Array}\n */\n function generateIntoCanvas(\n sdfWidth,\n sdfHeight,\n path,\n viewBox,\n maxDistance,\n sdfExponent,\n canvas,\n x,\n y,\n channel\n ) {\n if ( maxDistance === void 0 ) maxDistance = Math.max(viewBox[2] - viewBox[0], viewBox[3] - viewBox[1]) / 2;\n if ( sdfExponent === void 0 ) sdfExponent = 1;\n if ( x === void 0 ) x = 0;\n if ( y === void 0 ) y = 0;\n if ( channel === void 0 ) channel = 0;\n\n try {\n return generateIntoCanvas$1.apply(webgl, arguments)\n } catch(e) {\n console.info('WebGL SDF generation failed, falling back to JS', e);\n return generateIntoCanvas$2.apply(javascript, arguments)\n }\n }\n\n exports.forEachPathCommand = forEachPathCommand;\n exports.generate = generate;\n exports.generateIntoCanvas = generateIntoCanvas;\n exports.javascript = javascript;\n exports.pathToLineSegments = pathToLineSegments;\n exports.webgl = webgl;\n exports.webglUtils = webglUtils;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n return exports;\n\n}({}));\nreturn exports\n}\n\nexport { SDFGenerator as default };\n","function bidiFactory() {\nvar bidi = (function (exports) {\n\n // Bidi character types data, auto generated\n var DATA = {\n \"R\": \"13k,1a,2,3,3,2+1j,ch+16,a+1,5+2,2+n,5,a,4,6+16,4+3,h+1b,4mo,179q,2+9,2+11,2i9+7y,2+68,4,3+4,5+13,4+3,2+4k,3+29,8+cf,1t+7z,w+17,3+3m,1t+3z,16o1+5r,8+30,8+mc,29+1r,29+4v,75+73\",\n \"EN\": \"1c+9,3d+1,6,187+9,513,4+5,7+9,sf+j,175h+9,qw+q,161f+1d,4xt+a,25i+9\",\n \"ES\": \"17,2,6dp+1,f+1,av,16vr,mx+1,4o,2\",\n \"ET\": \"z+2,3h+3,b+1,ym,3e+1,2o,p4+1,8,6u,7c,g6,1wc,1n9+4,30+1b,2n,6d,qhx+1,h0m,a+1,49+2,63+1,4+1,6bb+3,12jj\",\n \"AN\": \"16o+5,2j+9,2+1,35,ed,1ff2+9,87+u\",\n \"CS\": \"18,2+1,b,2u,12k,55v,l,17v0,2,3,53,2+1,b\",\n \"B\": \"a,3,f+2,2v,690\",\n \"S\": \"9,2,k\",\n \"WS\": \"c,k,4f4,1vk+a,u,1j,335\",\n \"ON\": \"x+1,4+4,h+5,r+5,r+3,z,5+3,2+1,2+1,5,2+2,3+4,o,w,ci+1,8+d,3+d,6+8,2+g,39+1,9,6+1,2,33,b8,3+1,3c+1,7+1,5r,b,7h+3,sa+5,2,3i+6,jg+3,ur+9,2v,ij+1,9g+9,7+a,8m,4+1,49+x,14u,2+2,c+2,e+2,e+2,e+1,i+n,e+e,2+p,u+2,e+2,36+1,2+3,2+1,b,2+2,6+5,2,2,2,h+1,5+4,6+3,3+f,16+2,5+3l,3+81,1y+p,2+40,q+a,m+13,2r+ch,2+9e,75+hf,3+v,2+2w,6e+5,f+6,75+2a,1a+p,2+2g,d+5x,r+b,6+3,4+o,g,6+1,6+2,2k+1,4,2j,5h+z,1m+1,1e+f,t+2,1f+e,d+3,4o+3,2s+1,w,535+1r,h3l+1i,93+2,2s,b+1,3l+x,2v,4g+3,21+3,kz+1,g5v+1,5a,j+9,n+v,2,3,2+8,2+1,3+2,2,3,46+1,4+4,h+5,r+5,r+a,3h+2,4+6,b+4,78,1r+24,4+c,4,1hb,ey+6,103+j,16j+c,1ux+7,5+g,fsh,jdq+1t,4,57+2e,p1,1m,1m,1m,1m,4kt+1,7j+17,5+2r,d+e,3+e,2+e,2+10,m+4,w,1n+5,1q,4z+5,4b+rb,9+c,4+c,4+37,d+2g,8+b,l+b,5+1j,9+9,7+13,9+t,3+1,27+3c,2+29,2+3q,d+d,3+4,4+2,6+6,a+o,8+6,a+2,e+6,16+42,2+1i\",\n \"BN\": \"0+8,6+d,2s+5,2+p,e,4m9,1kt+2,2b+5,5+5,17q9+v,7k,6p+8,6+1,119d+3,440+7,96s+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+1,1ekf+75,6p+2rz,1ben+1,1ekf+1,1ekf+1\",\n \"NSM\": \"lc+33,7o+6,7c+18,2,2+1,2+1,2,21+a,1d+k,h,2u+6,3+5,3+1,2+3,10,v+q,2k+a,1n+8,a,p+3,2+8,2+2,2+4,18+2,3c+e,2+v,1k,2,5+7,5,4+6,b+1,u,1n,5+3,9,l+1,r,3+1,1m,5+1,5+1,3+2,4,v+1,4,c+1,1m,5+4,2+1,5,l+1,n+5,2,1n,3,2+3,9,8+1,c+1,v,1q,d,1f,4,1m+2,6+2,2+3,8+1,c+1,u,1n,g+1,l+1,t+1,1m+1,5+3,9,l+1,u,21,8+2,2,2j,3+6,d+7,2r,3+8,c+5,23+1,s,2,2,1k+d,2+4,2+1,6+a,2+z,a,2v+3,2+5,2+1,3+1,q+1,5+2,h+3,e,3+1,7,g,jk+2,qb+2,u+2,u+1,v+1,1t+1,2+6,9,3+a,a,1a+2,3c+1,z,3b+2,5+1,a,7+2,64+1,3,1n,2+6,2,2,3+7,7+9,3,1d+g,1s+3,1d,2+4,2,6,15+8,d+1,x+3,3+1,2+2,1l,2+1,4,2+2,1n+7,3+1,49+2,2+c,2+6,5,7,4+1,5j+1l,2+4,k1+w,2db+2,3y,2p+v,ff+3,30+1,n9x+3,2+9,x+1,29+1,7l,4,5,q+1,6,48+1,r+h,e,13+7,q+a,1b+2,1d,3+3,3+1,14,1w+5,3+1,3+1,d,9,1c,1g,2+2,3+1,6+1,2,17+1,9,6n,3,5,fn5,ki+f,h+f,r2,6b,46+4,1af+2,2+1,6+3,15+2,5,4m+1,fy+3,as+1,4a+a,4x,1j+e,1l+2,1e+3,3+1,1y+2,11+4,2+7,1r,d+1,1h+8,b+3,3,2o+2,3,2+1,7,4h,4+7,m+1,1m+1,4,12+6,4+4,5g+7,3+2,2,o,2d+5,2,5+1,2+1,6n+3,7+1,2+1,s+1,2e+7,3,2+1,2z,2,3+5,2,2u+2,3+3,2+4,78+8,2+1,75+1,2,5,41+3,3+1,5,x+5,3+1,15+5,3+3,9,a+5,3+2,1b+c,2+1,bb+6,2+5,2d+l,3+6,2+1,2+1,3f+5,4,2+1,2+6,2,21+1,4,2,9o+1,f0c+4,1o+6,t5,1s+3,2a,f5l+1,43t+2,i+7,3+6,v+3,45+2,1j0+1i,5+1d,9,f,n+4,2+e,11t+6,2+g,3+6,2+1,2+4,7a+6,c6+3,15t+6,32+6,gzhy+6n\",\n \"AL\": \"16w,3,2,e+1b,z+2,2+2s,g+1,8+1,b+m,2+t,s+2i,c+e,4h+f,1d+1e,1bwe+dp,3+3z,x+c,2+1,35+3y,2rm+z,5+7,b+5,dt+l,c+u,17nl+27,1t+27,4x+6n,3+d\",\n \"LRO\": \"6ct\",\n \"RLO\": \"6cu\",\n \"LRE\": \"6cq\",\n \"RLE\": \"6cr\",\n \"PDF\": \"6cs\",\n \"LRI\": \"6ee\",\n \"RLI\": \"6ef\",\n \"FSI\": \"6eg\",\n \"PDI\": \"6eh\"\n };\n\n var TYPES = {};\n var TYPES_TO_NAMES = {};\n TYPES.L = 1; //L is the default\n TYPES_TO_NAMES[1] = 'L';\n Object.keys(DATA).forEach(function (type, i) {\n TYPES[type] = 1 << (i + 1);\n TYPES_TO_NAMES[TYPES[type]] = type;\n });\n Object.freeze(TYPES);\n\n var ISOLATE_INIT_TYPES = TYPES.LRI | TYPES.RLI | TYPES.FSI;\n var STRONG_TYPES = TYPES.L | TYPES.R | TYPES.AL;\n var NEUTRAL_ISOLATE_TYPES = TYPES.B | TYPES.S | TYPES.WS | TYPES.ON | TYPES.FSI | TYPES.LRI | TYPES.RLI | TYPES.PDI;\n var BN_LIKE_TYPES = TYPES.BN | TYPES.RLE | TYPES.LRE | TYPES.RLO | TYPES.LRO | TYPES.PDF;\n var TRAILING_TYPES = TYPES.S | TYPES.WS | TYPES.B | ISOLATE_INIT_TYPES | TYPES.PDI | BN_LIKE_TYPES;\n\n var map = null;\n\n function parseData () {\n if (!map) {\n //const start = performance.now()\n map = new Map();\n var loop = function ( type ) {\n if (DATA.hasOwnProperty(type)) {\n var lastCode = 0;\n DATA[type].split(',').forEach(function (range) {\n var ref = range.split('+');\n var skip = ref[0];\n var step = ref[1];\n skip = parseInt(skip, 36);\n step = step ? parseInt(step, 36) : 0;\n map.set(lastCode += skip, TYPES[type]);\n for (var i = 0; i < step; i++) {\n map.set(++lastCode, TYPES[type]);\n }\n });\n }\n };\n\n for (var type in DATA) loop( type );\n //console.log(`char types parsed in ${performance.now() - start}ms`)\n }\n }\n\n /**\n * @param {string} char\n * @return {number}\n */\n function getBidiCharType (char) {\n parseData();\n return map.get(char.codePointAt(0)) || TYPES.L\n }\n\n function getBidiCharTypeName(char) {\n return TYPES_TO_NAMES[getBidiCharType(char)]\n }\n\n // Bidi bracket pairs data, auto generated\n var data$1 = {\n \"pairs\": \"14>1,1e>2,u>2,2wt>1,1>1,1ge>1,1wp>1,1j>1,f>1,hm>1,1>1,u>1,u6>1,1>1,+5,28>1,w>1,1>1,+3,b8>1,1>1,+3,1>3,-1>-1,3>1,1>1,+2,1s>1,1>1,x>1,th>1,1>1,+2,db>1,1>1,+3,3>1,1>1,+2,14qm>1,1>1,+1,4q>1,1e>2,u>2,2>1,+1\",\n \"canonical\": \"6f1>-6dx,6dy>-6dx,6ec>-6ed,6ee>-6ed,6ww>2jj,-2ji>2jj,14r4>-1e7l,1e7m>-1e7l,1e7m>-1e5c,1e5d>-1e5b,1e5c>-14qx,14qy>-14qx,14vn>-1ecg,1ech>-1ecg,1edu>-1ecg,1eci>-1ecg,1eda>-1ecg,1eci>-1ecg,1eci>-168q,168r>-168q,168s>-14ye,14yf>-14ye\"\n };\n\n /**\n * Parses an string that holds encoded codepoint mappings, e.g. for bracket pairs or\n * mirroring characters, as encoded by scripts/generateBidiData.js. Returns an object\n * holding the `map`, and optionally a `reverseMap` if `includeReverse:true`.\n * @param {string} encodedString\n * @param {boolean} includeReverse - true if you want reverseMap in the output\n * @return {{map: Map<number, number>, reverseMap?: Map<number, number>}}\n */\n function parseCharacterMap (encodedString, includeReverse) {\n var radix = 36;\n var lastCode = 0;\n var map = new Map();\n var reverseMap = includeReverse && new Map();\n var prevPair;\n encodedString.split(',').forEach(function visit(entry) {\n if (entry.indexOf('+') !== -1) {\n for (var i = +entry; i--;) {\n visit(prevPair);\n }\n } else {\n prevPair = entry;\n var ref = entry.split('>');\n var a = ref[0];\n var b = ref[1];\n a = String.fromCodePoint(lastCode += parseInt(a, radix));\n b = String.fromCodePoint(lastCode += parseInt(b, radix));\n map.set(a, b);\n includeReverse && reverseMap.set(b, a);\n }\n });\n return { map: map, reverseMap: reverseMap }\n }\n\n var openToClose, closeToOpen, canonical;\n\n function parse$1 () {\n if (!openToClose) {\n //const start = performance.now()\n var ref = parseCharacterMap(data$1.pairs, true);\n var map = ref.map;\n var reverseMap = ref.reverseMap;\n openToClose = map;\n closeToOpen = reverseMap;\n canonical = parseCharacterMap(data$1.canonical, false).map;\n //console.log(`brackets parsed in ${performance.now() - start}ms`)\n }\n }\n\n function openingToClosingBracket (char) {\n parse$1();\n return openToClose.get(char) || null\n }\n\n function closingToOpeningBracket (char) {\n parse$1();\n return closeToOpen.get(char) || null\n }\n\n function getCanonicalBracket (char) {\n parse$1();\n return canonical.get(char) || null\n }\n\n // Local type aliases\n var TYPE_L = TYPES.L;\n var TYPE_R = TYPES.R;\n var TYPE_EN = TYPES.EN;\n var TYPE_ES = TYPES.ES;\n var TYPE_ET = TYPES.ET;\n var TYPE_AN = TYPES.AN;\n var TYPE_CS = TYPES.CS;\n var TYPE_B = TYPES.B;\n var TYPE_S = TYPES.S;\n var TYPE_ON = TYPES.ON;\n var TYPE_BN = TYPES.BN;\n var TYPE_NSM = TYPES.NSM;\n var TYPE_AL = TYPES.AL;\n var TYPE_LRO = TYPES.LRO;\n var TYPE_RLO = TYPES.RLO;\n var TYPE_LRE = TYPES.LRE;\n var TYPE_RLE = TYPES.RLE;\n var TYPE_PDF = TYPES.PDF;\n var TYPE_LRI = TYPES.LRI;\n var TYPE_RLI = TYPES.RLI;\n var TYPE_FSI = TYPES.FSI;\n var TYPE_PDI = TYPES.PDI;\n\n /**\n * @typedef {object} GetEmbeddingLevelsResult\n * @property {{start, end, level}[]} paragraphs\n * @property {Uint8Array} levels\n */\n\n /**\n * This function applies the Bidirectional Algorithm to a string, returning the resolved embedding levels\n * in a single Uint8Array plus a list of objects holding each paragraph's start and end indices and resolved\n * base embedding level.\n *\n * @param {string} string - The input string\n * @param {\"ltr\"|\"rtl\"|\"auto\"} [baseDirection] - Use \"ltr\" or \"rtl\" to force a base paragraph direction,\n * otherwise a direction will be chosen automatically from each paragraph's contents.\n * @return {GetEmbeddingLevelsResult}\n */\n function getEmbeddingLevels (string, baseDirection) {\n var MAX_DEPTH = 125;\n\n // Start by mapping all characters to their unicode type, as a bitmask integer\n var charTypes = new Uint32Array(string.length);\n for (var i = 0; i < string.length; i++) {\n charTypes[i] = getBidiCharType(string[i]);\n }\n\n var charTypeCounts = new Map(); //will be cleared at start of each paragraph\n function changeCharType(i, type) {\n var oldType = charTypes[i];\n charTypes[i] = type;\n charTypeCounts.set(oldType, charTypeCounts.get(oldType) - 1);\n if (oldType & NEUTRAL_ISOLATE_TYPES) {\n charTypeCounts.set(NEUTRAL_ISOLATE_TYPES, charTypeCounts.get(NEUTRAL_ISOLATE_TYPES) - 1);\n }\n charTypeCounts.set(type, (charTypeCounts.get(type) || 0) + 1);\n if (type & NEUTRAL_ISOLATE_TYPES) {\n charTypeCounts.set(NEUTRAL_ISOLATE_TYPES, (charTypeCounts.get(NEUTRAL_ISOLATE_TYPES) || 0) + 1);\n }\n }\n\n var embedLevels = new Uint8Array(string.length);\n var isolationPairs = new Map(); //init->pdi and pdi->init\n\n // === 3.3.1 The Paragraph Level ===\n // 3.3.1 P1: Split the text into paragraphs\n var paragraphs = []; // [{start, end, level}, ...]\n var paragraph = null;\n for (var i$1 = 0; i$1 < string.length; i$1++) {\n if (!paragraph) {\n paragraphs.push(paragraph = {\n start: i$1,\n end: string.length - 1,\n // 3.3.1 P2-P3: Determine the paragraph level\n level: baseDirection === 'rtl' ? 1 : baseDirection === 'ltr' ? 0 : determineAutoEmbedLevel(i$1, false)\n });\n }\n if (charTypes[i$1] & TYPE_B) {\n paragraph.end = i$1;\n paragraph = null;\n }\n }\n\n var FORMATTING_TYPES = TYPE_RLE | TYPE_LRE | TYPE_RLO | TYPE_LRO | ISOLATE_INIT_TYPES | TYPE_PDI | TYPE_PDF | TYPE_B;\n var nextEven = function (n) { return n + ((n & 1) ? 1 : 2); };\n var nextOdd = function (n) { return n + ((n & 1) ? 2 : 1); };\n\n // Everything from here on will operate per paragraph.\n for (var paraIdx = 0; paraIdx < paragraphs.length; paraIdx++) {\n paragraph = paragraphs[paraIdx];\n var statusStack = [{\n _level: paragraph.level,\n _override: 0, //0=neutral, 1=L, 2=R\n _isolate: 0 //bool\n }];\n var stackTop = (void 0);\n var overflowIsolateCount = 0;\n var overflowEmbeddingCount = 0;\n var validIsolateCount = 0;\n charTypeCounts.clear();\n\n // === 3.3.2 Explicit Levels and Directions ===\n for (var i$2 = paragraph.start; i$2 <= paragraph.end; i$2++) {\n var charType = charTypes[i$2];\n stackTop = statusStack[statusStack.length - 1];\n\n // Set initial counts\n charTypeCounts.set(charType, (charTypeCounts.get(charType) || 0) + 1);\n if (charType & NEUTRAL_ISOLATE_TYPES) {\n charTypeCounts.set(NEUTRAL_ISOLATE_TYPES, (charTypeCounts.get(NEUTRAL_ISOLATE_TYPES) || 0) + 1);\n }\n\n // Explicit Embeddings: 3.3.2 X2 - X3\n if (charType & FORMATTING_TYPES) { //prefilter all formatters\n if (charType & (TYPE_RLE | TYPE_LRE)) {\n embedLevels[i$2] = stackTop._level; // 5.2\n var level = (charType === TYPE_RLE ? nextOdd : nextEven)(stackTop._level);\n if (level <= MAX_DEPTH && !overflowIsolateCount && !overflowEmbeddingCount) {\n statusStack.push({\n _level: level,\n _override: 0,\n _isolate: 0\n });\n } else if (!overflowIsolateCount) {\n overflowEmbeddingCount++;\n }\n }\n\n // Explicit Overrides: 3.3.2 X4 - X5\n else if (charType & (TYPE_RLO | TYPE_LRO)) {\n embedLevels[i$2] = stackTop._level; // 5.2\n var level$1 = (charType === TYPE_RLO ? nextOdd : nextEven)(stackTop._level);\n if (level$1 <= MAX_DEPTH && !overflowIsolateCount && !overflowEmbeddingCount) {\n statusStack.push({\n _level: level$1,\n _override: (charType & TYPE_RLO) ? TYPE_R : TYPE_L,\n _isolate: 0\n });\n } else if (!overflowIsolateCount) {\n overflowEmbeddingCount++;\n }\n }\n\n // Isolates: 3.3.2 X5a - X5c\n else if (charType & ISOLATE_INIT_TYPES) {\n // X5c - FSI becomes either RLI or LRI\n if (charType & TYPE_FSI) {\n charType = determineAutoEmbedLevel(i$2 + 1, true) === 1 ? TYPE_RLI : TYPE_LRI;\n }\n\n embedLevels[i$2] = stackTop._level;\n if (stackTop._override) {\n changeCharType(i$2, stackTop._override);\n }\n var level$2 = (charType === TYPE_RLI ? nextOdd : nextEven)(stackTop._level);\n if (level$2 <= MAX_DEPTH && overflowIsolateCount === 0 && overflowEmbeddingCount === 0) {\n validIsolateCount++;\n statusStack.push({\n _level: level$2,\n _override: 0,\n _isolate: 1,\n _isolInitIndex: i$2\n });\n } else {\n overflowIsolateCount++;\n }\n }\n\n // Terminating Isolates: 3.3.2 X6a\n else if (charType & TYPE_PDI) {\n if (overflowIsolateCount > 0) {\n overflowIsolateCount--;\n } else if (validIsolateCount > 0) {\n overflowEmbeddingCount = 0;\n while (!statusStack[statusStack.length - 1]._isolate) {\n statusStack.pop();\n }\n // Add to isolation pairs bidirectional mapping:\n var isolInitIndex = statusStack[statusStack.length - 1]._isolInitIndex;\n if (isolInitIndex != null) {\n isolationPairs.set(isolInitIndex, i$2);\n isolationPairs.set(i$2, isolInitIndex);\n }\n statusStack.pop();\n validIsolateCount--;\n }\n stackTop = statusStack[statusStack.length - 1];\n embedLevels[i$2] = stackTop._level;\n if (stackTop._override) {\n changeCharType(i$2, stackTop._override);\n }\n }\n\n\n // Terminating Embeddings and Overrides: 3.3.2 X7\n else if (charType & TYPE_PDF) {\n if (overflowIsolateCount === 0) {\n if (overflowEmbeddingCount > 0) {\n overflowEmbeddingCount--;\n } else if (!stackTop._isolate && statusStack.length > 1) {\n statusStack.pop();\n stackTop = statusStack[statusStack.length - 1];\n }\n }\n embedLevels[i$2] = stackTop._level; // 5.2\n }\n\n // End of Paragraph: 3.3.2 X8\n else if (charType & TYPE_B) {\n embedLevels[i$2] = paragraph.level;\n }\n }\n\n // Non-formatting characters: 3.3.2 X6\n else {\n embedLevels[i$2] = stackTop._level;\n // NOTE: This exclusion of BN seems to go against what section 5.2 says, but is required for test passage\n if (stackTop._override && charType !== TYPE_BN) {\n changeCharType(i$2, stackTop._override);\n }\n }\n }\n\n // === 3.3.3 Preparations for Implicit Processing ===\n\n // Remove all RLE, LRE, RLO, LRO, PDF, and BN characters: 3.3.3 X9\n // Note: Due to section 5.2, we won't remove them, but we'll use the BN_LIKE_TYPES bitset to\n // easily ignore them all from here on out.\n\n // 3.3.3 X10\n // Compute the set of isolating run sequences as specified by BD13\n var levelRuns = [];\n var currentRun = null;\n for (var i$3 = paragraph.start; i$3 <= paragraph.end; i$3++) {\n var charType$1 = charTypes[i$3];\n if (!(charType$1 & BN_LIKE_TYPES)) {\n var lvl = embedLevels[i$3];\n var isIsolInit = charType$1 & ISOLATE_INIT_TYPES;\n var isPDI = charType$1 === TYPE_PDI;\n if (currentRun && lvl === currentRun._level) {\n currentRun._end = i$3;\n currentRun._endsWithIsolInit = isIsolInit;\n } else {\n levelRuns.push(currentRun = {\n _start: i$3,\n _end: i$3,\n _level: lvl,\n _startsWithPDI: isPDI,\n _endsWithIsolInit: isIsolInit\n });\n }\n }\n }\n var isolatingRunSeqs = []; // [{seqIndices: [], sosType: L|R, eosType: L|R}]\n for (var runIdx = 0; runIdx < levelRuns.length; runIdx++) {\n var run = levelRuns[runIdx];\n if (!run._startsWithPDI || (run._startsWithPDI && !isolationPairs.has(run._start))) {\n var seqRuns = [currentRun = run];\n for (var pdiIndex = (void 0); currentRun && currentRun._endsWithIsolInit && (pdiIndex = isolationPairs.get(currentRun._end)) != null;) {\n for (var i$4 = runIdx + 1; i$4 < levelRuns.length; i$4++) {\n if (levelRuns[i$4]._start === pdiIndex) {\n seqRuns.push(currentRun = levelRuns[i$4]);\n break\n }\n }\n }\n // build flat list of indices across all runs:\n var seqIndices = [];\n for (var i$5 = 0; i$5 < seqRuns.length; i$5++) {\n var run$1 = seqRuns[i$5];\n for (var j = run$1._start; j <= run$1._end; j++) {\n seqIndices.push(j);\n }\n }\n // determine the sos/eos types:\n var firstLevel = embedLevels[seqIndices[0]];\n var prevLevel = paragraph.level;\n for (var i$6 = seqIndices[0] - 1; i$6 >= 0; i$6--) {\n if (!(charTypes[i$6] & BN_LIKE_TYPES)) { //5.2\n prevLevel = embedLevels[i$6];\n break\n }\n }\n var lastIndex = seqIndices[seqIndices.length - 1];\n var lastLevel = embedLevels[lastIndex];\n var nextLevel = paragraph.level;\n if (!(charTypes[lastIndex] & ISOLATE_INIT_TYPES)) {\n for (var i$7 = lastIndex + 1; i$7 <= paragraph.end; i$7++) {\n if (!(charTypes[i$7] & BN_LIKE_TYPES)) { //5.2\n nextLevel = embedLevels[i$7];\n break\n }\n }\n }\n isolatingRunSeqs.push({\n _seqIndices: seqIndices,\n _sosType: Math.max(prevLevel, firstLevel) % 2 ? TYPE_R : TYPE_L,\n _eosType: Math.max(nextLevel, lastLevel) % 2 ? TYPE_R : TYPE_L\n });\n }\n }\n\n // The next steps are done per isolating run sequence\n for (var seqIdx = 0; seqIdx < isolatingRunSeqs.length; seqIdx++) {\n var ref = isolatingRunSeqs[seqIdx];\n var seqIndices$1 = ref._seqIndices;\n var sosType = ref._sosType;\n var eosType = ref._eosType;\n /**\n * All the level runs in an isolating run sequence have the same embedding level.\n * \n * DO NOT change any `embedLevels[i]` within the current scope.\n */\n var embedDirection = ((embedLevels[seqIndices$1[0]]) & 1) ? TYPE_R : TYPE_L;\n\n // === 3.3.4 Resolving Weak Types ===\n\n // W1 + 5.2. Search backward from each NSM to the first character in the isolating run sequence whose\n // bidirectional type is not BN, and set the NSM to ON if it is an isolate initiator or PDI, and to its\n // type otherwise. If the NSM is the first non-BN character, change the NSM to the type of sos.\n if (charTypeCounts.get(TYPE_NSM)) {\n for (var si = 0; si < seqIndices$1.length; si++) {\n var i$8 = seqIndices$1[si];\n if (charTypes[i$8] & TYPE_NSM) {\n var prevType = sosType;\n for (var sj = si - 1; sj >= 0; sj--) {\n if (!(charTypes[seqIndices$1[sj]] & BN_LIKE_TYPES)) { //5.2 scan back to first non-BN\n prevType = charTypes[seqIndices$1[sj]];\n break\n }\n }\n changeCharType(i$8, (prevType & (ISOLATE_INIT_TYPES | TYPE_PDI)) ? TYPE_ON : prevType);\n }\n }\n }\n\n // W2. Search backward from each instance of a European number until the first strong type (R, L, AL, or sos)\n // is found. If an AL is found, change the type of the European number to Arabic number.\n if (charTypeCounts.get(TYPE_EN)) {\n for (var si$1 = 0; si$1 < seqIndices$1.length; si$1++) {\n var i$9 = seqIndices$1[si$1];\n if (charTypes[i$9] & TYPE_EN) {\n for (var sj$1 = si$1 - 1; sj$1 >= -1; sj$1--) {\n var prevCharType = sj$1 === -1 ? sosType : charTypes[seqIndices$1[sj$1]];\n if (prevCharType & STRONG_TYPES) {\n if (prevCharType === TYPE_AL) {\n changeCharType(i$9, TYPE_AN);\n }\n break\n }\n }\n }\n }\n }\n\n // W3. Change all ALs to R\n if (charTypeCounts.get(TYPE_AL)) {\n for (var si$2 = 0; si$2 < seqIndices$1.length; si$2++) {\n var i$10 = seqIndices$1[si$2];\n if (charTypes[i$10] & TYPE_AL) {\n changeCharType(i$10, TYPE_R);\n }\n }\n }\n\n // W4. A single European separator between two European numbers changes to a European number. A single common\n // separator between two numbers of the same type changes to that type.\n if (charTypeCounts.get(TYPE_ES) || charTypeCounts.get(TYPE_CS)) {\n for (var si$3 = 1; si$3 < seqIndices$1.length - 1; si$3++) {\n var i$11 = seqIndices$1[si$3];\n if (charTypes[i$11] & (TYPE_ES | TYPE_CS)) {\n var prevType$1 = 0, nextType = 0;\n for (var sj$2 = si$3 - 1; sj$2 >= 0; sj$2--) {\n prevType$1 = charTypes[seqIndices$1[sj$2]];\n if (!(prevType$1 & BN_LIKE_TYPES)) { //5.2\n break\n }\n }\n for (var sj$3 = si$3 + 1; sj$3 < seqIndices$1.length; sj$3++) {\n nextType = charTypes[seqIndices$1[sj$3]];\n if (!(nextType & BN_LIKE_TYPES)) { //5.2\n break\n }\n }\n if (prevType$1 === nextType && (charTypes[i$11] === TYPE_ES ? prevType$1 === TYPE_EN : (prevType$1 & (TYPE_EN | TYPE_AN)))) {\n changeCharType(i$11, prevType$1);\n }\n }\n }\n }\n\n // W5. A sequence of European terminators adjacent to European numbers changes to all European numbers.\n if (charTypeCounts.get(TYPE_EN)) {\n for (var si$4 = 0; si$4 < seqIndices$1.length; si$4++) {\n var i$12 = seqIndices$1[si$4];\n if (charTypes[i$12] & TYPE_EN) {\n for (var sj$4 = si$4 - 1; sj$4 >= 0 && (charTypes[seqIndices$1[sj$4]] & (TYPE_ET | BN_LIKE_TYPES)); sj$4--) {\n changeCharType(seqIndices$1[sj$4], TYPE_EN);\n }\n for (si$4++; si$4 < seqIndices$1.length && (charTypes[seqIndices$1[si$4]] & (TYPE_ET | BN_LIKE_TYPES | TYPE_EN)); si$4++) {\n if (charTypes[seqIndices$1[si$4]] !== TYPE_EN) {\n changeCharType(seqIndices$1[si$4], TYPE_EN);\n }\n }\n }\n }\n }\n\n // W6. Otherwise, separators and terminators change to Other Neutral.\n if (charTypeCounts.get(TYPE_ET) || charTypeCounts.get(TYPE_ES) || charTypeCounts.get(TYPE_CS)) {\n for (var si$5 = 0; si$5 < seqIndices$1.length; si$5++) {\n var i$13 = seqIndices$1[si$5];\n if (charTypes[i$13] & (TYPE_ET | TYPE_ES | TYPE_CS)) {\n changeCharType(i$13, TYPE_ON);\n // 5.2 transform adjacent BNs too:\n for (var sj$5 = si$5 - 1; sj$5 >= 0 && (charTypes[seqIndices$1[sj$5]] & BN_LIKE_TYPES); sj$5--) {\n changeCharType(seqIndices$1[sj$5], TYPE_ON);\n }\n for (var sj$6 = si$5 + 1; sj$6 < seqIndices$1.length && (charTypes[seqIndices$1[sj$6]] & BN_LIKE_TYPES); sj$6++) {\n changeCharType(seqIndices$1[sj$6], TYPE_ON);\n }\n }\n }\n }\n\n // W7. Search backward from each instance of a European number until the first strong type (R, L, or sos)\n // is found. If an L is found, then change the type of the European number to L.\n // NOTE: implemented in single forward pass for efficiency\n if (charTypeCounts.get(TYPE_EN)) {\n for (var si$6 = 0, prevStrongType = sosType; si$6 < seqIndices$1.length; si$6++) {\n var i$14 = seqIndices$1[si$6];\n var type = charTypes[i$14];\n if (type & TYPE_EN) {\n if (prevStrongType === TYPE_L) {\n changeCharType(i$14, TYPE_L);\n }\n } else if (type & STRONG_TYPES) {\n prevStrongType = type;\n }\n }\n }\n\n // === 3.3.5 Resolving Neutral and Isolate Formatting Types ===\n\n if (charTypeCounts.get(NEUTRAL_ISOLATE_TYPES)) {\n // N0. Process bracket pairs in an isolating run sequence sequentially in the logical order of the text\n // positions of the opening paired brackets using the logic given below. Within this scope, bidirectional\n // types EN and AN are treated as R.\n var R_TYPES_FOR_N_STEPS = (TYPE_R | TYPE_EN | TYPE_AN);\n var STRONG_TYPES_FOR_N_STEPS = R_TYPES_FOR_N_STEPS | TYPE_L;\n\n // * Identify the bracket pairs in the current isolating run sequence according to BD16.\n var bracketPairs = [];\n {\n var openerStack = [];\n for (var si$7 = 0; si$7 < seqIndices$1.length; si$7++) {\n // NOTE: for any potential bracket character we also test that it still carries a NI\n // type, as that may have been changed earlier. This doesn't seem to be explicitly\n // called out in the spec, but is required for passage of certain tests.\n if (charTypes[seqIndices$1[si$7]] & NEUTRAL_ISOLATE_TYPES) {\n var char = string[seqIndices$1[si$7]];\n var oppositeBracket = (void 0);\n // Opening bracket\n if (openingToClosingBracket(char) !== null) {\n if (openerStack.length < 63) {\n openerStack.push({ char: char, seqIndex: si$7 });\n } else {\n break\n }\n }\n // Closing bracket\n else if ((oppositeBracket = closingToOpeningBracket(char)) !== null) {\n for (var stackIdx = openerStack.length - 1; stackIdx >= 0; stackIdx--) {\n var stackChar = openerStack[stackIdx].char;\n if (stackChar === oppositeBracket ||\n stackChar === closingToOpeningBracket(getCanonicalBracket(char)) ||\n openingToClosingBracket(getCanonicalBracket(stackChar)) === char\n ) {\n bracketPairs.push([openerStack[stackIdx].seqIndex, si$7]);\n openerStack.length = stackIdx; //pop the matching bracket and all following\n break\n }\n }\n }\n }\n }\n bracketPairs.sort(function (a, b) { return a[0] - b[0]; });\n }\n // * For each bracket-pair element in the list of pairs of text positions\n for (var pairIdx = 0; pairIdx < bracketPairs.length; pairIdx++) {\n var ref$1 = bracketPairs[pairIdx];\n var openSeqIdx = ref$1[0];\n var closeSeqIdx = ref$1[1];\n // a. Inspect the bidirectional types of the characters enclosed within the bracket pair.\n // b. If any strong type (either L or R) matching the embedding direction is found, set the type for both\n // brackets in the pair to match the embedding direction.\n var foundStrongType = false;\n var useStrongType = 0;\n for (var si$8 = openSeqIdx + 1; si$8 < closeSeqIdx; si$8++) {\n var i$15 = seqIndices$1[si$8];\n if (charTypes[i$15] & STRONG_TYPES_FOR_N_STEPS) {\n foundStrongType = true;\n var lr = (charTypes[i$15] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L;\n if (lr === embedDirection) {\n useStrongType = lr;\n break\n }\n }\n }\n // c. Otherwise, if there is a strong type it must be opposite the embedding direction. Therefore, test\n // for an established context with a preceding strong type by checking backwards before the opening paired\n // bracket until the first strong type (L, R, or sos) is found.\n // 1. If the preceding strong type is also opposite the embedding direction, context is established, so\n // set the type for both brackets in the pair to that direction.\n // 2. Otherwise set the type for both brackets in the pair to the embedding direction.\n if (foundStrongType && !useStrongType) {\n useStrongType = sosType;\n for (var si$9 = openSeqIdx - 1; si$9 >= 0; si$9--) {\n var i$16 = seqIndices$1[si$9];\n if (charTypes[i$16] & STRONG_TYPES_FOR_N_STEPS) {\n var lr$1 = (charTypes[i$16] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L;\n if (lr$1 !== embedDirection) {\n useStrongType = lr$1;\n } else {\n useStrongType = embedDirection;\n }\n break\n }\n }\n }\n if (useStrongType) {\n charTypes[seqIndices$1[openSeqIdx]] = charTypes[seqIndices$1[closeSeqIdx]] = useStrongType;\n // * Any number of characters that had original bidirectional character type NSM prior to the application\n // of W1 that immediately follow a paired bracket which changed to L or R under N0 should change to match\n // the type of their preceding bracket.\n if (useStrongType !== embedDirection) {\n for (var si$10 = openSeqIdx + 1; si$10 < seqIndices$1.length; si$10++) {\n if (!(charTypes[seqIndices$1[si$10]] & BN_LIKE_TYPES)) {\n if (getBidiCharType(string[seqIndices$1[si$10]]) & TYPE_NSM) {\n charTypes[seqIndices$1[si$10]] = useStrongType;\n }\n break\n }\n }\n }\n if (useStrongType !== embedDirection) {\n for (var si$11 = closeSeqIdx + 1; si$11 < seqIndices$1.length; si$11++) {\n if (!(charTypes[seqIndices$1[si$11]] & BN_LIKE_TYPES)) {\n if (getBidiCharType(string[seqIndices$1[si$11]]) & TYPE_NSM) {\n charTypes[seqIndices$1[si$11]] = useStrongType;\n }\n break\n }\n }\n }\n }\n }\n\n // N1. A sequence of NIs takes the direction of the surrounding strong text if the text on both sides has the\n // same direction.\n // N2. Any remaining NIs take the embedding direction.\n for (var si$12 = 0; si$12 < seqIndices$1.length; si$12++) {\n if (charTypes[seqIndices$1[si$12]] & NEUTRAL_ISOLATE_TYPES) {\n var niRunStart = si$12, niRunEnd = si$12;\n var prevType$2 = sosType; //si === 0 ? sosType : (charTypes[seqIndices[si - 1]] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L\n for (var si2 = si$12 - 1; si2 >= 0; si2--) {\n if (charTypes[seqIndices$1[si2]] & BN_LIKE_TYPES) {\n niRunStart = si2; //5.2 treat BNs adjacent to NIs as NIs\n } else {\n prevType$2 = (charTypes[seqIndices$1[si2]] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L;\n break\n }\n }\n var nextType$1 = eosType;\n for (var si2$1 = si$12 + 1; si2$1 < seqIndices$1.length; si2$1++) {\n if (charTypes[seqIndices$1[si2$1]] & (NEUTRAL_ISOLATE_TYPES | BN_LIKE_TYPES)) {\n niRunEnd = si2$1;\n } else {\n nextType$1 = (charTypes[seqIndices$1[si2$1]] & R_TYPES_FOR_N_STEPS) ? TYPE_R : TYPE_L;\n break\n }\n }\n for (var sj$7 = niRunStart; sj$7 <= niRunEnd; sj$7++) {\n charTypes[seqIndices$1[sj$7]] = prevType$2 === nextType$1 ? prevType$2 : embedDirection;\n }\n si$12 = niRunEnd;\n }\n }\n }\n }\n\n // === 3.3.6 Resolving Implicit Levels ===\n\n for (var i$17 = paragraph.start; i$17 <= paragraph.end; i$17++) {\n var level$3 = embedLevels[i$17];\n var type$1 = charTypes[i$17];\n // I2. For all characters with an odd (right-to-left) embedding level, those of type L, EN or AN go up one level.\n if (level$3 & 1) {\n if (type$1 & (TYPE_L | TYPE_EN | TYPE_AN)) {\n embedLevels[i$17]++;\n }\n }\n // I1. For all characters with an even (left-to-right) embedding level, those of type R go up one level\n // and those of type AN or EN go up two levels.\n else {\n if (type$1 & TYPE_R) {\n embedLevels[i$17]++;\n } else if (type$1 & (TYPE_AN | TYPE_EN)) {\n embedLevels[i$17] += 2;\n }\n }\n\n // 5.2: Resolve any LRE, RLE, LRO, RLO, PDF, or BN to the level of the preceding character if there is one,\n // and otherwise to the base level.\n if (type$1 & BN_LIKE_TYPES) {\n embedLevels[i$17] = i$17 === 0 ? paragraph.level : embedLevels[i$17 - 1];\n }\n\n // 3.4 L1.1-4: Reset the embedding level of segment/paragraph separators, and any sequence of whitespace or\n // isolate formatting characters preceding them or the end of the paragraph, to the paragraph level.\n // NOTE: this will also need to be applied to each individual line ending after line wrapping occurs.\n if (i$17 === paragraph.end || getBidiCharType(string[i$17]) & (TYPE_S | TYPE_B)) {\n for (var j$1 = i$17; j$1 >= 0 && (getBidiCharType(string[j$1]) & TRAILING_TYPES); j$1--) {\n embedLevels[j$1] = paragraph.level;\n }\n }\n }\n }\n\n // DONE! The resolved levels can then be used, after line wrapping, to flip runs of characters\n // according to section 3.4 Reordering Resolved Levels\n return {\n levels: embedLevels,\n paragraphs: paragraphs\n }\n\n function determineAutoEmbedLevel (start, isFSI) {\n // 3.3.1 P2 - P3\n for (var i = start; i < string.length; i++) {\n var charType = charTypes[i];\n if (charType & (TYPE_R | TYPE_AL)) {\n return 1\n }\n if ((charType & (TYPE_B | TYPE_L)) || (isFSI && charType === TYPE_PDI)) {\n return 0\n }\n if (charType & ISOLATE_INIT_TYPES) {\n var pdi = indexOfMatchingPDI(i);\n i = pdi === -1 ? string.length : pdi;\n }\n }\n return 0\n }\n\n function indexOfMatchingPDI (isolateStart) {\n // 3.1.2 BD9\n var isolationLevel = 1;\n for (var i = isolateStart + 1; i < string.length; i++) {\n var charType = charTypes[i];\n if (charType & TYPE_B) {\n break\n }\n if (charType & TYPE_PDI) {\n if (--isolationLevel === 0) {\n return i\n }\n } else if (charType & ISOLATE_INIT_TYPES) {\n isolationLevel++;\n }\n }\n return -1\n }\n }\n\n // Bidi mirrored chars data, auto generated\n var data = \"14>1,j>2,t>2,u>2,1a>g,2v3>1,1>1,1ge>1,1wd>1,b>1,1j>1,f>1,ai>3,-2>3,+1,8>1k0,-1jq>1y7,-1y6>1hf,-1he>1h6,-1h5>1ha,-1h8>1qi,-1pu>1,6>3u,-3s>7,6>1,1>1,f>1,1>1,+2,3>1,1>1,+13,4>1,1>1,6>1eo,-1ee>1,3>1mg,-1me>1mk,-1mj>1mi,-1mg>1mi,-1md>1,1>1,+2,1>10k,-103>1,1>1,4>1,5>1,1>1,+10,3>1,1>8,-7>8,+1,-6>7,+1,a>1,1>1,u>1,u6>1,1>1,+5,26>1,1>1,2>1,2>2,8>1,7>1,4>1,1>1,+5,b8>1,1>1,+3,1>3,-2>1,2>1,1>1,+2,c>1,3>1,1>1,+2,h>1,3>1,a>1,1>1,2>1,3>1,1>1,d>1,f>1,3>1,1a>1,1>1,6>1,7>1,13>1,k>1,1>1,+19,4>1,1>1,+2,2>1,1>1,+18,m>1,a>1,1>1,lk>1,1>1,4>1,2>1,f>1,3>1,1>1,+3,db>1,1>1,+3,3>1,1>1,+2,14qm>1,1>1,+1,6>1,4j>1,j>2,t>2,u>2,2>1,+1\";\n\n var mirrorMap;\n\n function parse () {\n if (!mirrorMap) {\n //const start = performance.now()\n var ref = parseCharacterMap(data, true);\n var map = ref.map;\n var reverseMap = ref.reverseMap;\n // Combine both maps into one\n reverseMap.forEach(function (value, key) {\n map.set(key, value);\n });\n mirrorMap = map;\n //console.log(`mirrored chars parsed in ${performance.now() - start}ms`)\n }\n }\n\n function getMirroredCharacter (char) {\n parse();\n return mirrorMap.get(char) || null\n }\n\n /**\n * Given a string and its resolved embedding levels, build a map of indices to replacement chars\n * for any characters in right-to-left segments that have defined mirrored characters.\n * @param string\n * @param embeddingLevels\n * @param [start]\n * @param [end]\n * @return {Map<number, string>}\n */\n function getMirroredCharactersMap(string, embeddingLevels, start, end) {\n var strLen = string.length;\n start = Math.max(0, start == null ? 0 : +start);\n end = Math.min(strLen - 1, end == null ? strLen - 1 : +end);\n\n var map = new Map();\n for (var i = start; i <= end; i++) {\n if (embeddingLevels[i] & 1) { //only odd (rtl) levels\n var mirror = getMirroredCharacter(string[i]);\n if (mirror !== null) {\n map.set(i, mirror);\n }\n }\n }\n return map\n }\n\n /**\n * Given a start and end denoting a single line within a string, and a set of precalculated\n * bidi embedding levels, produce a list of segments whose ordering should be flipped, in sequence.\n * @param {string} string - the full input string\n * @param {GetEmbeddingLevelsResult} embeddingLevelsResult - the result object from getEmbeddingLevels\n * @param {number} [start] - first character in a subset of the full string\n * @param {number} [end] - last character in a subset of the full string\n * @return {number[][]} - the list of start/end segments that should be flipped, in order.\n */\n function getReorderSegments(string, embeddingLevelsResult, start, end) {\n var strLen = string.length;\n start = Math.max(0, start == null ? 0 : +start);\n end = Math.min(strLen - 1, end == null ? strLen - 1 : +end);\n\n var segments = [];\n embeddingLevelsResult.paragraphs.forEach(function (paragraph) {\n var lineStart = Math.max(start, paragraph.start);\n var lineEnd = Math.min(end, paragraph.end);\n if (lineStart < lineEnd) {\n // Local slice for mutation\n var lineLevels = embeddingLevelsResult.levels.slice(lineStart, lineEnd + 1);\n\n // 3.4 L1.4: Reset any sequence of whitespace characters and/or isolate formatting characters at the\n // end of the line to the paragraph level.\n for (var i = lineEnd; i >= lineStart && (getBidiCharType(string[i]) & TRAILING_TYPES); i--) {\n lineLevels[i] = paragraph.level;\n }\n\n // L2. From the highest level found in the text to the lowest odd level on each line, including intermediate levels\n // not actually present in the text, reverse any contiguous sequence of characters that are at that level or higher.\n var maxLevel = paragraph.level;\n var minOddLevel = Infinity;\n for (var i$1 = 0; i$1 < lineLevels.length; i$1++) {\n var level = lineLevels[i$1];\n if (level > maxLevel) { maxLevel = level; }\n if (level < minOddLevel) { minOddLevel = level | 1; }\n }\n for (var lvl = maxLevel; lvl >= minOddLevel; lvl--) {\n for (var i$2 = 0; i$2 < lineLevels.length; i$2++) {\n if (lineLevels[i$2] >= lvl) {\n var segStart = i$2;\n while (i$2 + 1 < lineLevels.length && lineLevels[i$2 + 1] >= lvl) {\n i$2++;\n }\n if (i$2 > segStart) {\n segments.push([segStart + lineStart, i$2 + lineStart]);\n }\n }\n }\n }\n }\n });\n return segments\n }\n\n /**\n * @param {string} string\n * @param {GetEmbeddingLevelsResult} embedLevelsResult\n * @param {number} [start]\n * @param {number} [end]\n * @return {string} the new string with bidi segments reordered\n */\n function getReorderedString(string, embedLevelsResult, start, end) {\n var indices = getReorderedIndices(string, embedLevelsResult, start, end);\n var chars = [].concat( string );\n indices.forEach(function (charIndex, i) {\n chars[i] = (\n (embedLevelsResult.levels[charIndex] & 1) ? getMirroredCharacter(string[charIndex]) : null\n ) || string[charIndex];\n });\n return chars.join('')\n }\n\n /**\n * @param {string} string\n * @param {GetEmbeddingLevelsResult} embedLevelsResult\n * @param {number} [start]\n * @param {number} [end]\n * @return {number[]} an array with character indices in their new bidi order\n */\n function getReorderedIndices(string, embedLevelsResult, start, end) {\n var segments = getReorderSegments(string, embedLevelsResult, start, end);\n // Fill an array with indices\n var indices = [];\n for (var i = 0; i < string.length; i++) {\n indices[i] = i;\n }\n // Reverse each segment in order\n segments.forEach(function (ref) {\n var start = ref[0];\n var end = ref[1];\n\n var slice = indices.slice(start, end + 1);\n for (var i = slice.length; i--;) {\n indices[end - i] = slice[i];\n }\n });\n return indices\n }\n\n exports.closingToOpeningBracket = closingToOpeningBracket;\n exports.getBidiCharType = getBidiCharType;\n exports.getBidiCharTypeName = getBidiCharTypeName;\n exports.getCanonicalBracket = getCanonicalBracket;\n exports.getEmbeddingLevels = getEmbeddingLevels;\n exports.getMirroredCharacter = getMirroredCharacter;\n exports.getMirroredCharactersMap = getMirroredCharactersMap;\n exports.getReorderSegments = getReorderSegments;\n exports.getReorderedIndices = getReorderedIndices;\n exports.getReorderedString = getReorderedString;\n exports.openingToClosingBracket = openingToClosingBracket;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n return exports;\n\n}({}));\nreturn bidi}\n\nexport default bidiFactory;\n","import { ShaderChunk, UniformsUtils, MeshDepthMaterial, RGBADepthPacking, MeshDistanceMaterial, ShaderLib, Matrix4, Vector3, Mesh, CylinderGeometry, Vector2, MeshStandardMaterial, DoubleSide } from 'three';\n\n/**\n * Regular expression for matching the `void main() {` opener line in GLSL.\n * @type {RegExp}\n */\nconst voidMainRegExp = /\\bvoid\\s+main\\s*\\(\\s*\\)\\s*{/g;\n\n/**\n * Recursively expands all `#include <xyz>` statements within string of shader code.\n * Copied from three's WebGLProgram#parseIncludes for external use.\n *\n * @param {string} source - The GLSL source code to evaluate\n * @return {string} The GLSL code with all includes expanded\n */\nfunction expandShaderIncludes( source ) {\n const pattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n function replace(match, include) {\n let chunk = ShaderChunk[include];\n return chunk ? expandShaderIncludes(chunk) : match\n }\n return source.replace( pattern, replace )\n}\n\n/*\n * This is a direct copy of MathUtils.generateUUID from Three.js, to preserve compatibility with three\n * versions before 0.113.0 as it was changed from Math to MathUtils in that version.\n * https://github.com/mrdoob/three.js/blob/dd8b5aa3b270c17096b90945cd2d6d1b13aaec53/src/math/MathUtils.js#L16\n */\n\nconst _lut = [];\n\nfor (let i = 0; i < 256; i++) {\n _lut[i] = (i < 16 ? '0' : '') + (i).toString(16);\n}\n\nfunction generateUUID() {\n\n // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n const d0 = Math.random() * 0xffffffff | 0;\n const d1 = Math.random() * 0xffffffff | 0;\n const d2 = Math.random() * 0xffffffff | 0;\n const d3 = Math.random() * 0xffffffff | 0;\n const uuid = _lut[d0 & 0xff] + _lut[d0 >> 8 & 0xff] + _lut[d0 >> 16 & 0xff] + _lut[d0 >> 24 & 0xff] + '-' +\n _lut[d1 & 0xff] + _lut[d1 >> 8 & 0xff] + '-' + _lut[d1 >> 16 & 0x0f | 0x40] + _lut[d1 >> 24 & 0xff] + '-' +\n _lut[d2 & 0x3f | 0x80] + _lut[d2 >> 8 & 0xff] + '-' + _lut[d2 >> 16 & 0xff] + _lut[d2 >> 24 & 0xff] +\n _lut[d3 & 0xff] + _lut[d3 >> 8 & 0xff] + _lut[d3 >> 16 & 0xff] + _lut[d3 >> 24 & 0xff];\n\n // .toUpperCase() here flattens concatenated strings to save heap memory space.\n return uuid.toUpperCase()\n\n}\n\n// Local assign polyfill to avoid importing troika-core\nconst assign = Object.assign || function(/*target, ...sources*/) {\n let target = arguments[0];\n for (let i = 1, len = arguments.length; i < len; i++) {\n let source = arguments[i];\n if (source) {\n for (let prop in source) {\n if (Object.prototype.hasOwnProperty.call(source, prop)) {\n target[prop] = source[prop];\n }\n }\n }\n }\n return target\n};\n\n\nconst epoch = Date.now();\nconst CONSTRUCTOR_CACHE = new WeakMap();\nconst SHADER_UPGRADE_CACHE = new Map();\n\n// Material ids must be integers, but we can't access the increment from Three's `Material` module,\n// so let's choose a sufficiently large starting value that should theoretically never collide.\nlet materialInstanceId = 1e10;\n\n/**\n * A utility for creating a custom shader material derived from another material's\n * shaders. This allows you to inject custom shader logic and transforms into the\n * builtin ThreeJS materials without having to recreate them from scratch.\n *\n * @param {THREE.Material} baseMaterial - the original material to derive from\n *\n * @param {Object} options - How the base material should be modified.\n * @param {Object=} options.defines - Custom `defines` for the material\n * @param {Object=} options.extensions - Custom `extensions` for the material, e.g. `{derivatives: true}`\n * @param {Object=} options.uniforms - Custom `uniforms` for use in the modified shader. These can\n * be accessed and manipulated via the resulting material's `uniforms` property, just like\n * in a ShaderMaterial. You do not need to repeat the base material's own uniforms here.\n * @param {String=} options.timeUniform - If specified, a uniform of this name will be injected into\n * both shaders, and it will automatically be updated on each render frame with a number of\n * elapsed milliseconds. The \"zero\" epoch time is not significant so don't rely on this as a\n * true calendar time.\n * @param {String=} options.vertexDefs - Custom GLSL code to inject into the vertex shader's top-level\n * definitions, above the `void main()` function.\n * @param {String=} options.vertexMainIntro - Custom GLSL code to inject at the top of the vertex\n * shader's `void main` function.\n * @param {String=} options.vertexMainOutro - Custom GLSL code to inject at the end of the vertex\n * shader's `void main` function.\n * @param {String=} options.vertexTransform - Custom GLSL code to manipulate the `position`, `normal`,\n * and/or `uv` vertex attributes. This code will be wrapped within a standalone function with\n * those attributes exposed by their normal names as read/write values.\n * @param {String=} options.fragmentDefs - Custom GLSL code to inject into the fragment shader's top-level\n * definitions, above the `void main()` function.\n * @param {String=} options.fragmentMainIntro - Custom GLSL code to inject at the top of the fragment\n * shader's `void main` function.\n * @param {String=} options.fragmentMainOutro - Custom GLSL code to inject at the end of the fragment\n * shader's `void main` function. You can manipulate `gl_FragColor` here but keep in mind it goes\n * after any of ThreeJS's color postprocessing shader chunks (tonemapping, fog, etc.), so if you\n * want those to apply to your changes use `fragmentColorTransform` instead.\n * @param {String=} options.fragmentColorTransform - Custom GLSL code to manipulate the `gl_FragColor`\n * output value. Will be injected near the end of the `void main` function, but before any\n * of ThreeJS's color postprocessing shader chunks (tonemapping, fog, etc.), and before the\n * `fragmentMainOutro`.\n * @param {function({fragmentShader: string, vertexShader:string}):\n * {fragmentShader: string, vertexShader:string}} options.customRewriter - A function\n * for performing custom rewrites of the full shader code. Useful if you need to do something\n * special that's not covered by the other builtin options. This function will be executed before\n * any other transforms are applied.\n * @param {boolean=} options.chained - Set to `true` to prototype-chain the derived material to the base\n * material, rather than the default behavior of copying it. This allows the derived material to\n * automatically pick up changes made to the base material and its properties. This can be useful\n * where the derived material is hidden from the user as an implementation detail, allowing them\n * to work with the original material like normal. But it can result in unexpected behavior if not\n * handled carefully.\n *\n * @return {THREE.Material}\n *\n * The returned material will also have two new methods, `getDepthMaterial()` and `getDistanceMaterial()`,\n * which can be called to get a variant of the derived material for use in shadow casting. If the\n * target mesh is expected to cast shadows, then you can assign these to the mesh's `customDepthMaterial`\n * (for directional and spot lights) and/or `customDistanceMaterial` (for point lights) properties to\n * allow the cast shadow to honor your derived shader's vertex transforms and discarded fragments. These\n * will also set a custom `#define IS_DEPTH_MATERIAL` or `#define IS_DISTANCE_MATERIAL` that you can look\n * for in your derived shaders with `#ifdef` to customize their behavior for the depth or distance\n * scenarios, e.g. skipping antialiasing or expensive shader logic.\n */\nfunction createDerivedMaterial(baseMaterial, options) {\n // Generate a key that is unique to the content of these `options`. We'll use this\n // throughout for caching and for generating the upgraded shader code. This increases\n // the likelihood that the resulting shaders will line up across multiple calls so\n // their GL programs can be shared and cached.\n const optionsKey = getKeyForOptions(options);\n\n // First check to see if we've already derived from this baseMaterial using this\n // unique set of options, and if so reuse the constructor to avoid some allocations.\n let ctorsByDerivation = CONSTRUCTOR_CACHE.get(baseMaterial);\n if (!ctorsByDerivation) {\n CONSTRUCTOR_CACHE.set(baseMaterial, (ctorsByDerivation = Object.create(null)));\n }\n if (ctorsByDerivation[optionsKey]) {\n return new ctorsByDerivation[optionsKey]()\n }\n\n const privateBeforeCompileProp = `_onBeforeCompile${optionsKey}`;\n\n // Private onBeforeCompile handler that injects the modified shaders and uniforms when\n // the renderer switches to this material's program\n const onBeforeCompile = function (shaderInfo, renderer) {\n baseMaterial.onBeforeCompile.call(this, shaderInfo, renderer);\n\n // Upgrade the shaders, caching the result by incoming source code\n const cacheKey = this.customProgramCacheKey() + '|' + shaderInfo.vertexShader + '|' + shaderInfo.fragmentShader;\n let upgradedShaders = SHADER_UPGRADE_CACHE[cacheKey];\n if (!upgradedShaders) {\n const upgraded = upgradeShaders(this, shaderInfo, options, optionsKey);\n upgradedShaders = SHADER_UPGRADE_CACHE[cacheKey] = upgraded;\n }\n\n // Inject upgraded shaders and uniforms into the program\n shaderInfo.vertexShader = upgradedShaders.vertexShader;\n shaderInfo.fragmentShader = upgradedShaders.fragmentShader;\n assign(shaderInfo.uniforms, this.uniforms);\n\n // Inject auto-updating time uniform if requested\n if (options.timeUniform) {\n shaderInfo.uniforms[options.timeUniform] = {\n get value() {return Date.now() - epoch}\n };\n }\n\n // Users can still add their own handlers on top of ours\n if (this[privateBeforeCompileProp]) {\n this[privateBeforeCompileProp](shaderInfo);\n }\n };\n\n const DerivedMaterial = function DerivedMaterial() {\n return derive(options.chained ? baseMaterial : baseMaterial.clone())\n };\n\n const derive = function(base) {\n // Prototype chain to the base material\n const derived = Object.create(base, descriptor);\n\n // Store the baseMaterial for reference; this is always the original even when cloning\n Object.defineProperty(derived, 'baseMaterial', { value: baseMaterial });\n\n // Needs its own ids\n Object.defineProperty(derived, 'id', { value: materialInstanceId++ });\n derived.uuid = generateUUID();\n\n // Merge uniforms, defines, and extensions\n derived.uniforms = assign({}, base.uniforms, options.uniforms);\n derived.defines = assign({}, base.defines, options.defines);\n derived.defines[`TROIKA_DERIVED_MATERIAL_${optionsKey}`] = ''; //force a program change from the base material\n derived.extensions = assign({}, base.extensions, options.extensions);\n\n // Don't inherit EventDispatcher listeners\n derived._listeners = undefined;\n\n return derived\n };\n\n const descriptor = {\n constructor: {value: DerivedMaterial},\n isDerivedMaterial: {value: true},\n\n type: {\n get: () => baseMaterial.type,\n set: (value) => {baseMaterial.type = value;}\n },\n\n isDerivedFrom: {\n writable: true,\n configurable: true,\n value: function (testMaterial) {\n const base = this.baseMaterial;\n return testMaterial === base || (base.isDerivedMaterial && base.isDerivedFrom(testMaterial)) || false\n }\n },\n\n customProgramCacheKey: {\n writable: true,\n configurable: true,\n value: function () {\n return baseMaterial.customProgramCacheKey() + '|' + optionsKey\n }\n },\n\n onBeforeCompile: {\n get() {\n return onBeforeCompile\n },\n set(fn) {\n this[privateBeforeCompileProp] = fn;\n }\n },\n\n copy: {\n writable: true,\n configurable: true,\n value: function (source) {\n baseMaterial.copy.call(this, source);\n if (!baseMaterial.isShaderMaterial && !baseMaterial.isDerivedMaterial) {\n assign(this.extensions, source.extensions);\n assign(this.defines, source.defines);\n assign(this.uniforms, UniformsUtils.clone(source.uniforms));\n }\n return this\n }\n },\n\n clone: {\n writable: true,\n configurable: true,\n value: function () {\n const newBase = new baseMaterial.constructor();\n return derive(newBase).copy(this)\n }\n },\n\n /**\n * Utility to get a MeshDepthMaterial that will honor this derived material's vertex\n * transformations and discarded fragments.\n */\n getDepthMaterial: {\n writable: true,\n configurable: true,\n value: function() {\n let depthMaterial = this._depthMaterial;\n if (!depthMaterial) {\n depthMaterial = this._depthMaterial = createDerivedMaterial(\n baseMaterial.isDerivedMaterial\n ? baseMaterial.getDepthMaterial()\n : new MeshDepthMaterial({ depthPacking: RGBADepthPacking }),\n options\n );\n depthMaterial.defines.IS_DEPTH_MATERIAL = '';\n depthMaterial.uniforms = this.uniforms; //automatically recieve same uniform values\n }\n return depthMaterial\n }\n },\n\n /**\n * Utility to get a MeshDistanceMaterial that will honor this derived material's vertex\n * transformations and discarded fragments.\n */\n getDistanceMaterial: {\n writable: true,\n configurable: true,\n value: function() {\n let distanceMaterial = this._distanceMaterial;\n if (!distanceMaterial) {\n distanceMaterial = this._distanceMaterial = createDerivedMaterial(\n baseMaterial.isDerivedMaterial\n ? baseMaterial.getDistanceMaterial()\n : new MeshDistanceMaterial(),\n options\n );\n distanceMaterial.defines.IS_DISTANCE_MATERIAL = '';\n distanceMaterial.uniforms = this.uniforms; //automatically recieve same uniform values\n }\n return distanceMaterial\n }\n },\n\n dispose: {\n writable: true,\n configurable: true,\n value() {\n const {_depthMaterial, _distanceMaterial} = this;\n if (_depthMaterial) _depthMaterial.dispose();\n if (_distanceMaterial) _distanceMaterial.dispose();\n baseMaterial.dispose.call(this);\n }\n }\n };\n\n ctorsByDerivation[optionsKey] = DerivedMaterial;\n return new DerivedMaterial()\n}\n\n\nfunction upgradeShaders(material, {vertexShader, fragmentShader}, options, key) {\n let {\n vertexDefs,\n vertexMainIntro,\n vertexMainOutro,\n vertexTransform,\n fragmentDefs,\n fragmentMainIntro,\n fragmentMainOutro,\n fragmentColorTransform,\n customRewriter,\n timeUniform\n } = options;\n\n vertexDefs = vertexDefs || '';\n vertexMainIntro = vertexMainIntro || '';\n vertexMainOutro = vertexMainOutro || '';\n fragmentDefs = fragmentDefs || '';\n fragmentMainIntro = fragmentMainIntro || '';\n fragmentMainOutro = fragmentMainOutro || '';\n\n // Expand includes if needed\n if (vertexTransform || customRewriter) {\n vertexShader = expandShaderIncludes(vertexShader);\n }\n if (fragmentColorTransform || customRewriter) {\n // We need to be able to find postprocessing chunks after include expansion in order to\n // put them after the fragmentColorTransform, so mark them with comments first. Even if\n // this particular derivation doesn't have a fragmentColorTransform, other derivations may,\n // so we still mark them.\n fragmentShader = fragmentShader.replace(\n /^[ \\t]*#include <((?:tonemapping|encodings|colorspace|fog|premultiplied_alpha|dithering)_fragment)>/gm,\n '\\n//!BEGIN_POST_CHUNK $1\\n$&\\n//!END_POST_CHUNK\\n'\n );\n fragmentShader = expandShaderIncludes(fragmentShader);\n }\n\n // Apply custom rewriter function\n if (customRewriter) {\n let res = customRewriter({vertexShader, fragmentShader});\n vertexShader = res.vertexShader;\n fragmentShader = res.fragmentShader;\n }\n\n // The fragmentColorTransform needs to go before any postprocessing chunks, so extract\n // those and re-insert them into the outro in the correct place:\n if (fragmentColorTransform) {\n let postChunks = [];\n fragmentShader = fragmentShader.replace(\n /^\\/\\/!BEGIN_POST_CHUNK[^]+?^\\/\\/!END_POST_CHUNK/gm, // [^]+? = non-greedy match of any chars including newlines\n match => {\n postChunks.push(match);\n return ''\n }\n );\n fragmentMainOutro = `${fragmentColorTransform}\\n${postChunks.join('\\n')}\\n${fragmentMainOutro}`;\n }\n\n // Inject auto-updating time uniform if requested\n if (timeUniform) {\n const code = `\\nuniform float ${timeUniform};\\n`;\n vertexDefs = code + vertexDefs;\n fragmentDefs = code + fragmentDefs;\n }\n\n // Inject a function for the vertexTransform and rename all usages of position/normal/uv\n if (vertexTransform) {\n // Hoist these defs to the very top so they work in other function defs\n vertexShader = `vec3 troika_position_${key};\nvec3 troika_normal_${key};\nvec2 troika_uv_${key};\n${vertexShader}\n`;\n vertexDefs = `${vertexDefs}\nvoid troikaVertexTransform${key}(inout vec3 position, inout vec3 normal, inout vec2 uv) {\n ${vertexTransform}\n}\n`;\n vertexMainIntro = `\ntroika_position_${key} = vec3(position);\ntroika_normal_${key} = vec3(normal);\ntroika_uv_${key} = vec2(uv);\ntroikaVertexTransform${key}(troika_position_${key}, troika_normal_${key}, troika_uv_${key});\n${vertexMainIntro}\n`;\n vertexShader = vertexShader.replace(/\\b(position|normal|uv)\\b/g, (match, match1, index, fullStr) => {\n return /\\battribute\\s+vec[23]\\s+$/.test(fullStr.substr(0, index)) ? match1 : `troika_${match1}_${key}`\n });\n\n // Three r152 introduced the MAP_UV token, replace it too if it's pointing to the main 'uv'\n // Perhaps the other textures too going forward?\n if (!(material.map && material.map.channel > 0)) {\n vertexShader = vertexShader.replace(/\\bMAP_UV\\b/g, `troika_uv_${key}`);\n }\n }\n\n // Inject defs and intro/outro snippets\n vertexShader = injectIntoShaderCode(vertexShader, key, vertexDefs, vertexMainIntro, vertexMainOutro);\n fragmentShader = injectIntoShaderCode(fragmentShader, key, fragmentDefs, fragmentMainIntro, fragmentMainOutro);\n\n return {\n vertexShader,\n fragmentShader\n }\n}\n\nfunction injectIntoShaderCode(shaderCode, id, defs, intro, outro) {\n if (intro || outro || defs) {\n shaderCode = shaderCode.replace(voidMainRegExp, `\n${defs}\nvoid troikaOrigMain${id}() {`\n );\n shaderCode += `\nvoid main() {\n ${intro}\n troikaOrigMain${id}();\n ${outro}\n}`;\n }\n return shaderCode\n}\n\n\nfunction optionsJsonReplacer(key, value) {\n return key === 'uniforms' ? undefined : typeof value === 'function' ? value.toString() : value\n}\n\nlet _idCtr = 0;\nconst optionsHashesToIds = new Map();\nfunction getKeyForOptions(options) {\n const optionsHash = JSON.stringify(options, optionsJsonReplacer);\n let id = optionsHashesToIds.get(optionsHash);\n if (id == null) {\n optionsHashesToIds.set(optionsHash, (id = ++_idCtr));\n }\n return id\n}\n\n// Copied from threejs WebGLPrograms.js so we can resolve builtin materials to their shaders\n// TODO how can we keep this from getting stale?\nconst MATERIAL_TYPES_TO_SHADERS = {\n MeshDepthMaterial: 'depth',\n MeshDistanceMaterial: 'distanceRGBA',\n MeshNormalMaterial: 'normal',\n MeshBasicMaterial: 'basic',\n MeshLambertMaterial: 'lambert',\n MeshPhongMaterial: 'phong',\n MeshToonMaterial: 'toon',\n MeshStandardMaterial: 'physical',\n MeshPhysicalMaterial: 'physical',\n MeshMatcapMaterial: 'matcap',\n LineBasicMaterial: 'basic',\n LineDashedMaterial: 'dashed',\n PointsMaterial: 'points',\n ShadowMaterial: 'shadow',\n SpriteMaterial: 'sprite'\n};\n\n/**\n * Given a Three.js `Material` instance, find the shaders/uniforms that will be\n * used to render that material.\n *\n * @param material - the Material instance\n * @return {object} - the material's shader info: `{uniforms:{}, fragmentShader:'', vertexShader:''}`\n */\nfunction getShadersForMaterial(material) {\n let builtinType = MATERIAL_TYPES_TO_SHADERS[material.type];\n return builtinType ? ShaderLib[builtinType] : material //TODO fallback for unknown type?\n}\n\n/**\n * Find all uniforms and their types within a shader code string.\n *\n * @param {string} shader - The shader code to parse\n * @return {object} mapping of uniform names to their glsl type\n */\nfunction getShaderUniformTypes(shader) {\n let uniformRE = /\\buniform\\s+(int|float|vec[234]|mat[34])\\s+([A-Za-z_][\\w]*)/g;\n let uniforms = Object.create(null);\n let match;\n while ((match = uniformRE.exec(shader)) !== null) {\n uniforms[match[2]] = match[1];\n }\n return uniforms\n}\n\n/**\n * Helper for smoothing out the `m.getInverse(x)` --> `m.copy(x).invert()` conversion\n * that happened in ThreeJS r123.\n * @param {Matrix4} srcMatrix\n * @param {Matrix4} [tgtMatrix]\n */\nfunction invertMatrix4(srcMatrix, tgtMatrix = new Matrix4()) {\n if (typeof tgtMatrix.invert === 'function') {\n tgtMatrix.copy(srcMatrix).invert();\n } else {\n tgtMatrix.getInverse(srcMatrix);\n }\n return tgtMatrix\n}\n\n/*\nInput geometry is a cylinder with r=1, height in y dimension from 0 to 1,\ndivided into a reasonable number of height segments.\n*/\n\nconst vertexDefs = `\nuniform vec3 pointA;\nuniform vec3 controlA;\nuniform vec3 controlB;\nuniform vec3 pointB;\nuniform float radius;\nvarying float bezierT;\n\nvec3 cubicBezier(vec3 p1, vec3 c1, vec3 c2, vec3 p2, float t) {\n float t2 = 1.0 - t;\n float b0 = t2 * t2 * t2;\n float b1 = 3.0 * t * t2 * t2;\n float b2 = 3.0 * t * t * t2;\n float b3 = t * t * t;\n return b0 * p1 + b1 * c1 + b2 * c2 + b3 * p2;\n}\n\nvec3 cubicBezierDerivative(vec3 p1, vec3 c1, vec3 c2, vec3 p2, float t) {\n float t2 = 1.0 - t;\n return -3.0 * p1 * t2 * t2 +\n c1 * (3.0 * t2 * t2 - 6.0 * t2 * t) +\n c2 * (6.0 * t2 * t - 3.0 * t * t) +\n 3.0 * p2 * t * t;\n}\n`;\n\nconst vertexTransform = `\nfloat t = position.y;\nbezierT = t;\nvec3 bezierCenterPos = cubicBezier(pointA, controlA, controlB, pointB, t);\nvec3 bezierDir = normalize(cubicBezierDerivative(pointA, controlA, controlB, pointB, t));\n\n// Make \"sideways\" always perpendicular to the camera ray; this ensures that any twists\n// in the cylinder occur where you won't see them: \nvec3 viewDirection = normalMatrix * vec3(0.0, 0.0, 1.0);\nif (bezierDir == viewDirection) {\n bezierDir = normalize(cubicBezierDerivative(pointA, controlA, controlB, pointB, t == 1.0 ? t - 0.0001 : t + 0.0001));\n}\nvec3 sideways = normalize(cross(bezierDir, viewDirection));\nvec3 upish = normalize(cross(sideways, bezierDir));\n\n// Build a matrix for transforming this disc in the cylinder:\nmat4 discTx;\ndiscTx[0].xyz = sideways * radius;\ndiscTx[1].xyz = bezierDir * radius;\ndiscTx[2].xyz = upish * radius;\ndiscTx[3].xyz = bezierCenterPos;\ndiscTx[3][3] = 1.0;\n\n// Apply transform, ignoring original y\nposition = (discTx * vec4(position.x, 0.0, position.z, 1.0)).xyz;\nnormal = normalize(mat3(discTx) * normal);\n`;\n\nconst fragmentDefs = `\nuniform vec3 dashing;\nvarying float bezierT;\n`;\n\nconst fragmentMainIntro = `\nif (dashing.x + dashing.y > 0.0) {\n float dashFrac = mod(bezierT - dashing.z, dashing.x + dashing.y);\n if (dashFrac > dashing.x) {\n discard;\n }\n}\n`;\n\n// Debugging: separate color for each of the 6 sides:\n// const fragmentColorTransform = `\n// float sideNum = floor(vUV.x * 6.0);\n// vec3 mixColor = sideNum < 1.0 ? vec3(1.0, 0.0, 0.0) :\n// sideNum < 2.0 ? vec3(0.0, 1.0, 1.0) :\n// sideNum < 3.0 ? vec3(1.0, 1.0, 0.0) :\n// sideNum < 4.0 ? vec3(0.0, 0.0, 1.0) :\n// sideNum < 5.0 ? vec3(0.0, 1.0, 0.0) :\n// vec3(1.0, 0.0, 1.0);\n// gl_FragColor.xyz = mix(gl_FragColor.xyz, mixColor, 0.5);\n// `\n\n\n\nfunction createBezierMeshMaterial(baseMaterial) {\n return createDerivedMaterial(\n baseMaterial,\n {\n chained: true,\n uniforms: {\n pointA: {value: new Vector3()},\n controlA: {value: new Vector3()},\n controlB: {value: new Vector3()},\n pointB: {value: new Vector3()},\n radius: {value: 0.01},\n dashing: {value: new Vector3()} //on, off, offset\n },\n vertexDefs,\n vertexTransform,\n fragmentDefs,\n fragmentMainIntro\n }\n )\n}\n\nlet geometry = null;\n\nconst defaultBaseMaterial = /*#__PURE__*/new MeshStandardMaterial({color: 0xffffff, side: DoubleSide});\n\n\n/**\n * A ThreeJS `Mesh` that bends a tube shape along a 3D cubic bezier path. The bending is done\n * by deforming a straight cylindrical geometry in the vertex shader based on a set of four\n * control point uniforms. It patches the necessary GLSL into the mesh's assigned `material`\n * automatically.\n *\n * The cubiz bezier path is determined by its four `Vector3` properties:\n * - `pointA`\n * - `controlA`\n * - `controlB`\n * - `pointB`\n *\n * The tube's radius is controlled by its `radius` property, which defaults to `0.01`.\n *\n * You can also give the tube a dashed appearance with two properties:\n *\n * - `dashArray` - an array of two numbers, defining the length of \"on\" and \"off\" parts of\n * the dash. Each is a 0-1 ratio of the entire path's length. (Actually this is the `t` length\n * used as input to the cubic bezier function, not its visible length.)\n * - `dashOffset` - offset of where the dash starts. You can animate this to make the dashes move.\n *\n * Note that the dashes will appear like a hollow tube, not solid. This will be more apparent on\n * thicker tubes.\n *\n * TODO: proper geometry bounding sphere and raycasting\n * TODO: allow control of the geometry's segment counts\n */\nclass BezierMesh extends Mesh {\n static getGeometry() {\n return geometry || (geometry =\n new CylinderGeometry(1, 1, 1, 6, 64).translate(0, 0.5, 0)\n )\n }\n\n constructor() {\n super(\n BezierMesh.getGeometry(),\n defaultBaseMaterial\n );\n\n this.pointA = new Vector3();\n this.controlA = new Vector3();\n this.controlB = new Vector3();\n this.pointB = new Vector3();\n this.radius = 0.01;\n this.dashArray = new Vector2();\n this.dashOffset = 0;\n\n // TODO - disabling frustum culling until I figure out how to customize the\n // geometry's bounding sphere that gets used\n this.frustumCulled = false;\n }\n\n // Handler for automatically wrapping the base material with our upgrades. We do the wrapping\n // lazily on _read_ rather than write to avoid unnecessary wrapping on transient values.\n get material() {\n let derivedMaterial = this._derivedMaterial;\n const baseMaterial = this._baseMaterial || this._defaultMaterial || (this._defaultMaterial = defaultBaseMaterial.clone());\n if (!derivedMaterial || derivedMaterial.baseMaterial !== baseMaterial) {\n derivedMaterial = this._derivedMaterial = createBezierMeshMaterial(baseMaterial);\n // dispose the derived material when its base material is disposed:\n baseMaterial.addEventListener('dispose', function onDispose() {\n baseMaterial.removeEventListener('dispose', onDispose);\n derivedMaterial.dispose();\n });\n }\n return derivedMaterial\n }\n set material(baseMaterial) {\n this._baseMaterial = baseMaterial;\n }\n\n // Create and update material for shadows upon request:\n get customDepthMaterial() {\n return this.material.getDepthMaterial()\n }\n set customDepthMaterial(m) {\n // future: let the user override with their own?\n }\n get customDistanceMaterial() {\n return this.material.getDistanceMaterial()\n }\n set customDistanceMaterial(m) {\n // future: let the user override with their own?\n }\n\n onBeforeRender() {\n const {uniforms} = this.material;\n const {pointA, controlA, controlB, pointB, radius, dashArray, dashOffset} = this;\n uniforms.pointA.value.copy(pointA);\n uniforms.controlA.value.copy(controlA);\n uniforms.controlB.value.copy(controlB);\n uniforms.pointB.value.copy(pointB);\n uniforms.radius.value = radius;\n uniforms.dashing.value.set(dashArray.x, dashArray.y, dashOffset || 0);\n }\n\n raycast(/*raycaster, intersects*/) {\n // TODO - just fail for now\n }\n}\n\nexport { BezierMesh, createDerivedMaterial, expandShaderIncludes, getShaderUniformTypes, getShadersForMaterial, invertMatrix4, voidMainRegExp };\n","import * as THREE from 'three';\r\nimport type { Floor } from '../data/types.js';\r\nimport { polygonCentroid, toMeters, type VenueFrame } from './coords.js';\r\nimport { SLAB_HEIGHT, polygonLabelAngle, shapeHeight, shapeRole } from './geometry.js';\r\n\r\n/** Mirror of geometry's thin-strip rule: strips this narrow render FLAT. */\r\nconst THIN_STRIP_M = 1.0;\r\n\r\nfunction ringThickness(ring: [number, number][]): number {\r\n let area = 0;\r\n let perim = 0;\r\n for (let i = 0; i < ring.length; i++) {\r\n const p = ring[i];\r\n const q = ring[(i + 1) % ring.length];\r\n if (!p || !q) continue;\r\n area += p[0] * q[1] - q[0] * p[1];\r\n perim += Math.hypot(q[0] - p[0], q[1] - p[1]);\r\n }\r\n // |shoelace sum| / perimeter ≡ 2·area/perimeter — geometry's exact metric\r\n return perim > 0 ? Math.abs(area) / perim : 0;\r\n}\r\n\r\n/** The polygon's \"level\" axis — same horizontal-first pick the labels use. */\r\nfunction levelAxis(ring: [number, number][]): number {\r\n const a = polygonLabelAngle(ring);\r\n let b = a + Math.PI / 2;\r\n while (b > Math.PI / 2) b -= Math.PI;\r\n while (b <= -Math.PI / 2) b += Math.PI;\r\n return Math.abs(a) <= Math.abs(b) ? a : b;\r\n}\r\n\r\n/**\r\n * Amenity markers: flat circular badges lying on the map at each amenity's\r\n * node — escalators, stairs, lifts, restrooms, info desks. They REPLACE the\r\n * text label for amenity locations, are drawn as built-in vector glyphs (no\r\n * network dependency), and flip with the labels so they stay readable.\r\n */\r\nexport interface AmenityMarkers {\r\n object: THREE.Object3D;\r\n setFlip(flipped: boolean): void;\r\n /** Orient the FLOATING connection pins toward the viewer (map bearing/pitch). */\r\n setCameraView(bearingDeg: number, pitchDeg: number): void;\r\n dispose(): void;\r\n}\r\n\r\nconst MARKER_DIAMETER_M = 2.6;\r\n// Floating connection pins: the badge hovers just above the floor, upright and\r\n// turned toward the camera, so escalators/stairs/lifts stay legible instead of\r\n// foreshortening to an ellipse under pitch.\r\nconst FLOAT_DIAMETER_M = 2.2;\r\nconst FLOAT_HEIGHT_M = 2.6;\r\nconst BADGE_FILL = '#5b6470'; // slate — visible on light floors, never loud\r\nconst GLYPH_INK = '#ffffff';\r\n\r\ntype Glyph = 'escalator' | 'stairs' | 'elevator' | 'restroom' | 'info' | 'default';\r\n\r\n/** Vertical circulation — the amenities that MOVE you between floors. */\r\nfunction isConnection(amenity: string): boolean {\r\n const a = amenity.toLowerCase();\r\n return (\r\n a.includes('escalator') ||\r\n a.includes('stair') ||\r\n a.includes('elevator') ||\r\n a.includes('lift') ||\r\n a.includes('travelator') ||\r\n a.includes('walkway') ||\r\n a.includes('ramp')\r\n );\r\n}\r\n\r\nfunction glyphFor(amenity: string): Glyph {\r\n const a = amenity.toLowerCase();\r\n if (a.includes('escalator')) return 'escalator';\r\n if (a.includes('stair')) return 'stairs';\r\n if (a.includes('elevator') || a.includes('lift')) return 'elevator';\r\n if (a.includes('restroom') || a.includes('washroom') || a.includes('toilet')) return 'restroom';\r\n if (a.includes('information')) return 'info';\r\n return 'default';\r\n}\r\n\r\n/** Step polyline shared by the stairs and escalator glyphs. */\r\nfunction drawSteps(ctx: CanvasRenderingContext2D): void {\r\n ctx.beginPath();\r\n ctx.moveTo(36, 90);\r\n ctx.lineTo(52, 90);\r\n ctx.lineTo(52, 74);\r\n ctx.lineTo(68, 74);\r\n ctx.lineTo(68, 58);\r\n ctx.lineTo(84, 58);\r\n ctx.lineTo(84, 42);\r\n ctx.lineTo(94, 42);\r\n ctx.stroke();\r\n}\r\n\r\nconst textureCache = new Map<Glyph, THREE.CanvasTexture>();\r\n\r\nfunction badgeTexture(glyph: Glyph): THREE.CanvasTexture {\r\n const cached = textureCache.get(glyph);\r\n if (cached) return cached;\r\n const c = document.createElement('canvas');\r\n c.width = 128;\r\n c.height = 128;\r\n const ctx = c.getContext('2d');\r\n if (ctx) {\r\n // badge circle with a soft white ring so it reads on any floor colour\r\n ctx.beginPath();\r\n ctx.arc(64, 64, 56, 0, Math.PI * 2);\r\n ctx.fillStyle = BADGE_FILL;\r\n ctx.fill();\r\n ctx.lineWidth = 7;\r\n ctx.strokeStyle = 'rgba(255,255,255,0.95)';\r\n ctx.stroke();\r\n ctx.strokeStyle = GLYPH_INK;\r\n ctx.fillStyle = GLYPH_INK;\r\n ctx.lineWidth = 9;\r\n ctx.lineCap = 'round';\r\n ctx.lineJoin = 'round';\r\n ctx.textAlign = 'center';\r\n ctx.textBaseline = 'middle';\r\n switch (glyph) {\r\n case 'stairs':\r\n drawSteps(ctx);\r\n break;\r\n case 'escalator': {\r\n drawSteps(ctx);\r\n // diagonal rail with an up arrowhead — distinguishes it from stairs\r\n ctx.beginPath();\r\n ctx.moveTo(40, 62);\r\n ctx.lineTo(74, 28);\r\n ctx.stroke();\r\n ctx.beginPath();\r\n ctx.moveTo(58, 26);\r\n ctx.lineTo(78, 24);\r\n ctx.lineTo(76, 44);\r\n ctx.closePath();\r\n ctx.fill();\r\n break;\r\n }\r\n case 'elevator': {\r\n ctx.lineWidth = 8;\r\n ctx.strokeRect(38, 34, 52, 60);\r\n ctx.beginPath(); // up triangle\r\n ctx.moveTo(64, 44);\r\n ctx.lineTo(52, 58);\r\n ctx.lineTo(76, 58);\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.beginPath(); // down triangle\r\n ctx.moveTo(64, 84);\r\n ctx.lineTo(52, 70);\r\n ctx.lineTo(76, 70);\r\n ctx.closePath();\r\n ctx.fill();\r\n break;\r\n }\r\n case 'restroom':\r\n ctx.font = 'bold 44px system-ui, sans-serif';\r\n ctx.fillText('WC', 64, 66);\r\n break;\r\n case 'info':\r\n ctx.font = 'bold italic 72px Georgia, serif';\r\n ctx.fillText('i', 64, 66);\r\n break;\r\n default:\r\n ctx.beginPath();\r\n ctx.arc(64, 64, 14, 0, Math.PI * 2);\r\n ctx.fill();\r\n }\r\n }\r\n const tex = new THREE.CanvasTexture(c);\r\n tex.colorSpace = THREE.SRGBColorSpace;\r\n tex.anisotropy = 4;\r\n textureCache.set(glyph, tex);\r\n return tex;\r\n}\r\n\r\n/**\r\n * Badge with a REAL icon from the venue's default icon set (CDN SVG), drawn\r\n * onto the circle once it loads; until then (or if it fails) the badge shows\r\n * the built-in vector glyph. Textures cached per url+colour.\r\n */\r\nconst iconTextureCache = new Map<string, THREE.CanvasTexture>();\r\n\r\nfunction iconBadgeTexture(\r\n iconUrl: string,\r\n fill: string,\r\n fallback: Glyph,\r\n onLoad?: () => void,\r\n): THREE.CanvasTexture {\r\n const key = `${iconUrl}|${fill}`;\r\n const cached = iconTextureCache.get(key);\r\n if (cached) return cached;\r\n const c = document.createElement('canvas');\r\n c.width = 128;\r\n c.height = 128;\r\n const ctx = c.getContext('2d');\r\n const tex = new THREE.CanvasTexture(c);\r\n tex.colorSpace = THREE.SRGBColorSpace;\r\n tex.anisotropy = 4;\r\n const drawCircle = (): void => {\r\n if (!ctx) return;\r\n ctx.clearRect(0, 0, 128, 128);\r\n ctx.beginPath();\r\n ctx.arc(64, 64, 56, 0, Math.PI * 2);\r\n ctx.fillStyle = fill;\r\n ctx.fill();\r\n ctx.lineWidth = 7;\r\n ctx.strokeStyle = 'rgba(255,255,255,0.95)';\r\n ctx.stroke();\r\n };\r\n drawCircle();\r\n const img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n img.onload = () => {\r\n if (!ctx) return;\r\n drawCircle();\r\n ctx.drawImage(img, 32, 32, 64, 64); // icon centred inside the circle\r\n tex.needsUpdate = true;\r\n onLoad?.();\r\n };\r\n img.onerror = () => {\r\n // icon unavailable → fall back to the built-in glyph badge\r\n const glyphCanvas = badgeTexture(fallback).image as HTMLCanvasElement;\r\n if (ctx) ctx.drawImage(glyphCanvas, 0, 0);\r\n tex.needsUpdate = true;\r\n onLoad?.();\r\n };\r\n img.src = iconUrl;\r\n iconTextureCache.set(key, tex);\r\n return tex;\r\n}\r\n\r\n/**\r\n * Build the amenity markers for one floor; null when the floor has none.\r\n * Every amenity gets a badge — connections (escalators, stairs, lifts)\r\n * included, at their node. An amenity WITH a polygon gets its badge centred\r\n * ON TOP of that polygon at its extruded height; shapeless amenities sit at\r\n * their node at floor level. Icons resolve exactly like v1: the location's\r\n * CATEGORY icon first, then the amenity key through the venue's default icon\r\n * set, then the built-in glyph.\r\n */\r\nexport function createAmenityMarkers(\r\n frame: VenueFrame,\r\n floor: Floor,\r\n iconset: Record<string, string> = {},\r\n onIconLoad?: () => void,\r\n): AmenityMarkers | null {\r\n const nodesById = new Map(floor.nodes.map((n) => [n.id, n]));\r\n const shapesById = new Map(floor.shapes.map((s) => [s.id, s]));\r\n const group = new THREE.Group();\r\n const entries: { mesh: THREE.Mesh; base: number }[] = [];\r\n const floating: THREE.Mesh[] = [];\r\n const geo = new THREE.PlaneGeometry(1, 1);\r\n const floatGeo = new THREE.PlaneGeometry(1, 1);\r\n for (const loc of floor.locations) {\r\n if (!loc.amenity || loc.hidden) continue;\r\n let x: number | undefined;\r\n let y: number | undefined;\r\n let z = SLAB_HEIGHT + 0.16; // shapeless fallback: node at floor level\r\n let base = 0;\r\n const shape = loc.shapeId ? shapesById.get(loc.shapeId) : undefined;\r\n if (shape && shape.geometry.type === 'Polygon' && shape.geometry.coordinates[0]) {\r\n // EXACTLY on top of the polygon, aligned like labels/logos: centred at\r\n // the centroid, rotated to the shape's level axis, and sitting on the\r\n // RENDERED top — which for thin strips is the flattened slab, not the\r\n // editor height (that mismatch is what left the badge floating mid-air).\r\n const ring = shape.geometry.coordinates[0].map((p) => toMeters(frame, p));\r\n [x, y] = polygonCentroid(ring);\r\n base = levelAxis(ring);\r\n const role = shapeRole(shape);\r\n let renderedH = 0.1; // flat zones cap just above the slab\r\n if (role === 'unit') {\r\n renderedH = ringThickness(ring) < THIN_STRIP_M ? 0.12 : shapeHeight(shape, role);\r\n }\r\n z = SLAB_HEIGHT + renderedH + 0.12;\r\n } else if (loc.nodeId) {\r\n const node = nodesById.get(loc.nodeId);\r\n if (node) [x, y] = toMeters(frame, [node.lng, node.lat]);\r\n }\r\n if (x === undefined || y === undefined) continue;\r\n // icon resolution, v1 order: category icon → amenity key in the venue's\r\n // default icon set → built-in glyph\r\n const category = loc.categories[0];\r\n const iconUrl = category?.icon ?? iconset[loc.amenity.toUpperCase()];\r\n const fill = category?.colorHex ?? BADGE_FILL;\r\n const glyph = glyphFor(loc.amenity);\r\n const mat = new THREE.MeshBasicMaterial({\r\n map: iconUrl ? iconBadgeTexture(iconUrl, fill, glyph, onIconLoad) : badgeTexture(glyph),\r\n transparent: true,\r\n depthWrite: false,\r\n });\r\n if (isConnection(loc.amenity)) {\r\n // FLOATING pin: badge hovers above the anchor, standing upright and\r\n // turned toward the camera — never a flat ellipse.\r\n const badge = new THREE.Mesh(floatGeo, mat);\r\n badge.scale.set(FLOAT_DIAMETER_M, FLOAT_DIAMETER_M, 1);\r\n badge.position.set(x, y, z + FLOAT_HEIGHT_M);\r\n badge.renderOrder = 6;\r\n badge.frustumCulled = false;\r\n group.add(badge);\r\n floating.push(badge);\r\n continue;\r\n }\r\n const mesh = new THREE.Mesh(geo, mat);\r\n mesh.scale.set(MARKER_DIAMETER_M, MARKER_DIAMETER_M, 1);\r\n mesh.position.set(x, y, z);\r\n mesh.rotation.z = base;\r\n group.add(mesh);\r\n entries.push({ mesh, base });\r\n }\r\n if (!entries.length && !floating.length) {\r\n geo.dispose();\r\n floatGeo.dispose();\r\n return null;\r\n }\r\n return {\r\n object: group,\r\n // FLAT markers keep their polygon-aligned base yaw and flip with the labels\r\n // so WC / i glyphs never read upside-down\r\n setFlip(flipped: boolean): void {\r\n const extra = flipped ? Math.PI : 0;\r\n for (const e of entries) e.mesh.rotation.z = e.base + extra;\r\n },\r\n // FLOATING pins billboard instead: the camera's view matrix is folded into\r\n // one combined projection matrix here, so a THREE.Sprite can't face the\r\n // viewer — build the facing from the map's own bearing + pitch.\r\n setCameraView(bearingDeg: number, pitchDeg: number): void {\r\n const rx = (pitchDeg * Math.PI) / 180;\r\n const rz = (-bearingDeg * Math.PI) / 180;\r\n for (const badge of floating) badge.rotation.set(rx, 0, rz, 'ZXY');\r\n },\r\n dispose(): void {\r\n geo.dispose();\r\n floatGeo.dispose();\r\n for (const e of entries) (e.mesh.material as THREE.Material).dispose();\r\n for (const b of floating) (b.material as THREE.Material).dispose();\r\n // badge textures stay cached — shared across floors and rebuilds\r\n },\r\n };\r\n}\r\n","import * as THREE from 'three';\r\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\r\nimport type { MapObjectDef } from '../data/types.js';\r\nimport type { Venue } from '../data/venue-model.js';\r\nimport { toMeters, type VenueFrame } from './coords.js';\r\nimport { SLAB_HEIGHT } from './geometry.js';\r\n\r\nexport interface ModelInstance {\r\n url: string;\r\n matrix: THREE.Matrix4;\r\n}\r\n\r\n/**\r\n * Group map objects by model URL and compute per-instance transforms in the\r\n * venue-local frame (pure — unit-testable without a loader or WebGL).\r\n * Repeated models render via InstancedMesh: one draw call per mesh per URL.\r\n */\r\nexport function computeModelInstances(\r\n frame: VenueFrame,\r\n venue: Venue,\r\n floorId: string,\r\n): Map<string, THREE.Matrix4[]> {\r\n const byUrl = new Map<string, THREE.Matrix4[]>();\r\n const dummy = new THREE.Object3D();\r\n for (const def of venue.mapObjects) {\r\n const node = venue.getNode(def.nodeId);\r\n if (!node || node.floorId !== floorId || !def.modelUrl) continue;\r\n const [x, y] = toMeters(frame, [node.lng, node.lat]);\r\n // altitude is relative to the WALKING surface — the slab top — not world\r\n // zero; placing at raw altitude (0 in this venue) sank models into the slab\r\n dummy.position.set(x, y, SLAB_HEIGHT + def.altitude);\r\n // The editor's rotation value is NOT degrees: v1 decodes yaw as PI/value\r\n // (e.g. 1.6 → 112.5°, 0.88 → 204.5° — verified against the live venue,\r\n // matching the mall's building grid). Treating it as degrees left every\r\n // model unrotated. X = 90° maps the GLB's y-up into our z-up frame; the\r\n // yaw then lands on the (new) local Y, which is world up.\r\n const yaw = def.rotation !== 0 ? Math.PI / def.rotation : 0;\r\n dummy.rotation.set(Math.PI / 2, yaw, 0);\r\n dummy.scale.setScalar(def.scale || 1);\r\n dummy.updateMatrix();\r\n const list = byUrl.get(def.modelUrl) ?? [];\r\n list.push(dummy.matrix.clone());\r\n byUrl.set(def.modelUrl, list);\r\n }\r\n return byUrl;\r\n}\r\n\r\n/**\r\n * Load a floor's GLB models and return a group of InstancedMeshes (one per\r\n * mesh per distinct URL). Browser-only (GLTFLoader). Failed loads are\r\n * skipped with a console warning — a missing tree never blocks the map.\r\n */\r\nexport async function loadFloorModels(\r\n frame: VenueFrame,\r\n venue: Venue,\r\n floorId: string,\r\n defs?: MapObjectDef[],\r\n): Promise<THREE.Group | null> {\r\n void defs;\r\n const byUrl = computeModelInstances(frame, venue, floorId);\r\n if (byUrl.size === 0) return null;\r\n const loader = new GLTFLoader();\r\n const group = new THREE.Group();\r\n await Promise.all(\r\n [...byUrl.entries()].map(async ([url, matrices]) => {\r\n try {\r\n const gltf = await loader.loadAsync(url);\r\n gltf.scene.traverse((obj) => {\r\n if (!(obj instanceof THREE.Mesh)) return;\r\n const mesh = obj as THREE.Mesh<THREE.BufferGeometry, THREE.Material>;\r\n const instanced = new THREE.InstancedMesh(mesh.geometry, mesh.material, matrices.length);\r\n matrices.forEach((m, i) => {\r\n instanced.setMatrixAt(i, new THREE.Matrix4().multiplyMatrices(m, mesh.matrixWorld));\r\n });\r\n instanced.instanceMatrix.needsUpdate = true;\r\n group.add(instanced);\r\n });\r\n } catch (err) {\r\n console.warn(`becomap: failed to load model ${url}`, err);\r\n }\r\n }),\r\n );\r\n return group;\r\n}\r\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInstancedMesh,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace,\n\tInstancedBufferAttribute\n} from 'three';\nimport { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js';\n\nclass GLTFLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsDispersionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureAVIFExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( parser );\n\n\t\t} );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\t// If a base path is set, resources will be relative paths from that plus the relative path of the gltf file\n\t\t\t// Example path = 'https://my-cnd-server.com/', url = 'assets/models/model.gltf'\n\t\t\t// resourcePath = 'https://my-cnd-server.com/assets/models/'\n\t\t\t// referenced resource 'model.bin' will be loaded from 'https://my-cnd-server.com/assets/models/model.bin'\n\t\t\t// referenced resource '../textures/texture.png' will be loaded from 'https://my-cnd-server.com/assets/textures/texture.png'\n\t\t\tconst relativeUrl = LoaderUtils.extractUrlBase( url );\n\t\t\tresourcePath = LoaderUtils.resolveURL( relativeUrl, this.path );\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tparse( data, path, onLoad, onError ) {\n\n\t\tlet json;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tjson = JSON.parse( data );\n\n\t\t} else if ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tjson = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content );\n\n\t\t\t} else {\n\n\t\t\t\tjson = JSON.parse( textDecoder.decode( data ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tjson = data;\n\n\t\t}\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\n\t\t\tif ( ! plugin.name ) console.error( 'THREE.GLTFLoader: Invalid plugin found: missing name' );\n\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_DISPERSION: 'KHR_materials_dispersion',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_MATERIALS_BUMP: 'EXT_materials_bump',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_TEXTURE_AVIF: 'EXT_texture_avif',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\tEXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.setRGB( lightDef.color[ 0 ], lightDef.color[ 1 ], lightDef.color[ 2 ], LinearSRGBColorSpace );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tlightNode.decay = 2;\n\n\t\tassignExtrasToUserData( lightNode, lightDef );\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tgetDependency( type, index ) {\n\n\t\tif ( type !== 'light' ) return;\n\n\t\treturn this._loadLight( index );\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials dispersion Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion\n */\nclass GLTFMaterialsDispersionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_DISPERSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.dispersion = extension.dispersion !== undefined ? extension.dispersion : 0;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tconst colorFactor = extension.sheenColorFactor;\n\t\t\tmaterialParams.sheenColor.setRGB( colorFactor[ 0 ], colorFactor[ 1 ], colorFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || Infinity;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_MATERIALS_BUMP;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.bumpScale = extension.bumpFactor !== undefined ? extension.bumpFactor : 1.0;\n\n\t\tif ( extension.bumpTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'bumpMap', extension.bumpTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials anisotropy Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.anisotropyStrength !== undefined ) {\n\n\t\t\tmaterialParams.anisotropy = extension.anisotropyStrength;\n\n\t\t}\n\n\t\tif ( extension.anisotropyRotation !== undefined ) {\n\n\t\t\tmaterialParams.anisotropyRotation = extension.anisotropyRotation;\n\n\t\t}\n\n\t\tif ( extension.anisotropyTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t// WebP images, unfortunately.\n\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * AVIF Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif\n */\nclass GLTFTextureAVIFExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_AVIF;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: AVIF required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image.\n\t\t\t\timage.src = 'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=';\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn buffer.then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst source = new Uint8Array( res, byteOffset, byteLength );\n\n\t\t\t\tif ( decoder.decodeGltfBufferAsync ) {\n\n\t\t\t\t\treturn decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) {\n\n\t\t\t\t\t\treturn res.buffer;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\t\t\treturn decoder.ready.then( function () {\n\n\t\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING;\n\t\tthis.parser = parser;\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] ||\n\t\t\tnodeDef.mesh === undefined ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst meshDef = json.meshes[ nodeDef.mesh ];\n\n\t\t// No Points or Lines + Instancing support yet\n\n\t\tfor ( const primitive of meshDef.primitives ) {\n\n\t\t\tif ( primitive.mode !== WEBGL_CONSTANTS.TRIANGLES &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN &&\n\t\t\t\t primitive.mode !== undefined ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensionDef = nodeDef.extensions[ this.name ];\n\t\tconst attributesDef = extensionDef.attributes;\n\n\t\t// @TODO: Can we support InstancedMesh + SkinnedMesh?\n\n\t\tconst pending = [];\n\t\tconst attributes = {};\n\n\t\tfor ( const key in attributesDef ) {\n\n\t\t\tpending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => {\n\n\t\t\t\tattributes[ key ] = accessor;\n\t\t\t\treturn attributes[ key ];\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( pending.length < 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tpending.push( this.parser.createNodeMesh( nodeIndex ) );\n\n\t\treturn Promise.all( pending ).then( results => {\n\n\t\t\tconst nodeObject = results.pop();\n\t\t\tconst meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ];\n\t\t\tconst count = results[ 0 ].count; // All attribute counts should be same\n\t\t\tconst instancedMeshes = [];\n\n\t\t\tfor ( const mesh of meshes ) {\n\n\t\t\t\t// Temporal variables\n\t\t\t\tconst m = new Matrix4();\n\t\t\t\tconst p = new Vector3();\n\t\t\t\tconst q = new Quaternion();\n\t\t\t\tconst s = new Vector3( 1, 1, 1 );\n\n\t\t\t\tconst instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count );\n\n\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\tif ( attributes.TRANSLATION ) {\n\n\t\t\t\t\t\tp.fromBufferAttribute( attributes.TRANSLATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.ROTATION ) {\n\n\t\t\t\t\t\tq.fromBufferAttribute( attributes.ROTATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.SCALE ) {\n\n\t\t\t\t\t\ts.fromBufferAttribute( attributes.SCALE, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinstancedMesh.setMatrixAt( i, m.compose( p, q, s ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Add instance attributes to the geometry, excluding TRS.\n\t\t\t\tfor ( const attributeName in attributes ) {\n\n\t\t\t\t\tif ( attributeName === '_COLOR_0' ) {\n\n\t\t\t\t\t\tconst attr = attributes[ attributeName ];\n\t\t\t\t\t\tinstancedMesh.instanceColor = new InstancedBufferAttribute( attr.array, attr.itemSize, attr.normalized );\n\n\t\t\t\t\t} else if ( attributeName !== 'TRANSLATION' &&\n\t\t\t\t\t\t attributeName !== 'ROTATION' &&\n\t\t\t\t\t\t attributeName !== 'SCALE' ) {\n\n\t\t\t\t\t\tmesh.geometry.setAttribute( attributeName, attributes[ attributeName ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Just in case\n\t\t\t\tObject3D.prototype.copy.call( instancedMesh, mesh );\n\n\t\t\t\tthis.parser.assignFinalMaterial( instancedMesh );\n\n\t\t\t\tinstancedMeshes.push( instancedMesh );\n\n\t\t\t}\n\n\t\t\tif ( nodeObject.isGroup ) {\n\n\t\t\t\tnodeObject.clear();\n\n\t\t\t\tnodeObject.add( ... instancedMeshes );\n\n\t\t\t\treturn nodeObject;\n\n\t\t\t}\n\n\t\t\treturn instancedMeshes[ 0 ];\n\n\t\t} );\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tthis.header = {\n\t\t\tmagic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = textDecoder.decode( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType.name;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( ( transform.texCoord === undefined || transform.texCoord === texture.channel )\n\t\t\t&& transform.offset === undefined\n\t\t\t&& transform.rotation === undefined\n\t\t\t&& transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\ttexture.channel = transform.texCoord;\n\n\t\t}\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t// [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _q = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv1',\n\tTEXCOORD_2: 'uv2',\n\tTEXCOORD_3: 'uv3',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n *\n * @param {Object<String, Material>} cache\n * @return {Material}\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tlet geometryKey;\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\tif ( primitiveDef.targets !== undefined ) {\n\n\t\tfor ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) {\n\n\t\t\tgeometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] );\n\n\t\t}\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\tif ( uri.search( /\\.ktx2($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/ktx2/ ) === 0 ) return 'image/ktx2';\n\n\treturn 'image/png';\n\n}\n\nconst _identityMatrix = new Matrix4();\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Node cache\n\t\tthis.nodeCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tlet isSafari = false;\n\t\tlet safariVersion = - 1;\n\t\tlet isFirefox = false;\n\t\tlet firefoxVersion = - 1;\n\n\t\tif ( typeof navigator !== 'undefined' ) {\n\n\t\t\tconst userAgent = navigator.userAgent;\n\n\t\t\tisSafari = /^((?!chrome|android).)*safari/i.test( userAgent ) === true;\n\t\t\tconst safariMatch = userAgent.match( /Version\\/(\\d+)/ );\n\t\t\tsafariVersion = isSafari && safariMatch ? parseInt( safariMatch[ 1 ], 10 ) : - 1;\n\n\t\t\tisFirefox = userAgent.indexOf( 'Firefox' ) > - 1;\n\t\t\tfirefoxVersion = isFirefox ? userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\t}\n\n\t\tif ( typeof createImageBitmap === 'undefined' || ( isSafari && safariVersion < 17 ) || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\t\tthis.nodeCache = {};\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\treturn Promise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tfor ( const scene of result.scenes ) {\n\n\t\t\t\t\tscene.updateMatrixWorld();\n\n\t\t\t\t}\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t *\n\t * @param {Object} cache\n\t * @param {Object3D} index\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/**\n\t * Returns a reference to a shared resource, cloning it if necessary.\n\t *\n\t * @param {Object} cache\n\t * @param {Number} index\n\t * @param {Object} object\n\t * @return {Object}\n\t */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadNode && ext.loadNode( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext != this && ext.getDependency && ext.getDependency( type, index );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( ! dependency ) {\n\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise<Array<Object>>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\tconst normalized = accessorDef.normalized === true;\n\n\t\t\tconst array = new TypedArray( accessorDef.count * itemSize );\n\t\t\treturn Promise.resolve( new BufferAttribute( array, itemSize, normalized ) );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\t// Ignore normalized since we copy from sparse\n\t\t\t\tbufferAttribute.normalized = false;\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute.normalized = normalized;\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise<THREE.Texture|null>}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\ttexture.flipY = false;\n\n\t\t\ttexture.name = textureDef.name || sourceDef.name || '';\n\n\t\t\tif ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) {\n\n\t\t\t\ttexture.name = sourceDef.uri;\n\n\t\t\t}\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\t\t\ttexture.generateMipmaps = ! texture.isCompressedTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\tloadImageSource( sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\n\t\tif ( sourceDef.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( texture, sourceDef );\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t *\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @param {string} colorSpace\n\t * @return {Promise<Texture>}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, colorSpace ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture ) return null;\n\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) {\n\n\t\t\t\ttexture = texture.clone();\n\t\t\t\ttexture.channel = mapDef.texCoord;\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = colorSpace;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\tlineMaterial.map = material.map;\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise<Material>}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tconst emissiveFactor = materialDef.emissiveFactor;\n\t\t\tmaterialParams.emissive = new Color().setRGB( emissiveFactor[ 0 ], emissiveFactor[ 1 ], emissiveFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tconst material = new materialType( materialParams );\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * When Object3D instances are targeted by animation, they need unique names.\n\t *\n\t * @param {String} originalName\n\t * @return {String}\n\t */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tif ( sanitizedName in this.nodeNamesUsed ) {\n\n\t\t\treturn sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] );\n\n\t\t} else {\n\n\t\t\tthis.nodeNamesUsed[ sanitizedName ] = 0;\n\n\t\t\treturn sanitizedName;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array<GLTF.Primitive>} primitives\n\t * @return {Promise<Array<BufferGeometry>>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise<Group|Mesh|SkinnedMesh>}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true ) {\n\n\t\t\t\t\t\t// normalize skin weights to fix malformed assets (see #15319)\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef );\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef );\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise<THREE.Camera>}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise<Skeleton>}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) {\n\n\t\t\tpending.push( this._loadNodeShallow( skinDef.joints[ i ] ) );\n\n\t\t}\n\n\t\tif ( skinDef.inverseBindMatrices !== undefined ) {\n\n\t\t\tpending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) );\n\n\t\t} else {\n\n\t\t\tpending.push( null );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst inverseBindMatrices = results.pop();\n\t\t\tconst jointNodes = results;\n\n\t\t\t// Note that bones (joint nodes) may or may not be in the\n\t\t\t// scene graph at this time.\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = jointNodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst jointNode = jointNodes[ i ];\n\n\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\tif ( inverseBindMatrices !== null ) {\n\n\t\t\t\t\t\tmat.fromArray( inverseBindMatrices.array, i * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinDef.joints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise<AnimationClip>}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\t\tconst animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node;\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tif ( target.node === undefined ) continue;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tif ( node.updateMatrix ) {\n\n\t\t\t\t\tnode.updateMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tconst createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target );\n\n\t\t\t\tif ( createdTracks ) {\n\n\t\t\t\t\tfor ( let k = 0; k < createdTracks.length; k ++ ) {\n\n\t\t\t\t\t\ttracks.push( createdTracks[ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( animationName, undefined, tracks );\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise<Object3D>}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tconst nodePending = parser._loadNodeShallow( nodeIndex );\n\n\t\tconst childPending = [];\n\t\tconst childrenDef = nodeDef.children || [];\n\n\t\tfor ( let i = 0, il = childrenDef.length; i < il; i ++ ) {\n\n\t\t\tchildPending.push( parser.getDependency( 'node', childrenDef[ i ] ) );\n\n\t\t}\n\n\t\tconst skeletonPending = nodeDef.skin === undefined\n\t\t\t? Promise.resolve( null )\n\t\t\t: parser.getDependency( 'skin', nodeDef.skin );\n\n\t\treturn Promise.all( [\n\t\t\tnodePending,\n\t\t\tPromise.all( childPending ),\n\t\t\tskeletonPending\n\t\t] ).then( function ( results ) {\n\n\t\t\tconst node = results[ 0 ];\n\t\t\tconst children = results[ 1 ];\n\t\t\tconst skeleton = results[ 2 ];\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\t// This full traverse should be fine because\n\t\t\t\t// child glTF nodes have not been added to this node yet.\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isSkinnedMesh ) return;\n\n\t\t\t\t\tmesh.bind( skeleton, _identityMatrix );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tnode.add( children[ i ] );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t// ._loadNodeShallow() parses a single node.\n\t// skin and child nodes are created and added in .loadNode() (no '_' prefix).\n\t_loadNodeShallow( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\t// This method is called from .loadNode() and .loadSkin().\n\t\t// Cache a node to avoid duplication.\n\n\t\tif ( this.nodeCache[ nodeIndex ] !== undefined ) {\n\n\t\t\treturn this.nodeCache[ nodeIndex ];\n\n\t\t}\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\tconst pending = [];\n\n\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t} );\n\n\t\tif ( meshPromise ) {\n\n\t\t\tpending.push( meshPromise );\n\n\t\t}\n\n\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t} ).forEach( function ( promise ) {\n\n\t\t\tpending.push( promise );\n\n\t\t} );\n\n\t\tthis.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) {\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t\treturn this.nodeCache[ nodeIndex ];\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise<Group>}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( parser.getDependency( 'node', nodeIds[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( nodes ) {\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tscene.add( nodes[ i ] );\n\n\t\t\t}\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n\t_createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) {\n\n\t\tconst tracks = [];\n\n\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\tconst targetNames = [];\n\n\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\ttargetNames.push( targetName );\n\n\t\t}\n\n\t\tlet TypedKeyframeTrack;\n\n\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.position:\n\t\t\tcase PATH_PROPERTIES.scale:\n\n\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tswitch ( outputAccessor.itemSize ) {\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\tcase 3:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\n\t\tconst outputArray = this._getArrayFromAccessor( outputAccessor );\n\n\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\tinputAccessor.array,\n\t\t\t\toutputArray,\n\t\t\t\tinterpolation\n\t\t\t);\n\n\t\t\t// Override interpolation with custom factory method.\n\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\tthis._createCubicSplineTrackInterpolant( track );\n\n\t\t\t}\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\t_getArrayFromAccessor( accessor ) {\n\n\t\tlet outputArray = accessor.array;\n\n\t\tif ( accessor.normalized ) {\n\n\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t}\n\n\t\t\toutputArray = scaled;\n\n\t\t}\n\n\t\treturn outputArray;\n\n\t}\n\n\t_createCubicSplineTrackInterpolant( track ) {\n\n\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t};\n\n\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tif ( ColorManagement.workingColorSpace !== LinearSRGBColorSpace && 'COLOR_0' in attributes ) {\n\n\t\tconsole.warn( `THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${ColorManagement.workingColorSpace}\" not supported.` );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\nexport { GLTFLoader };\n","import * as THREE from 'three';\r\n\r\n/**\r\n * Named colour themes for store polygons.\r\n *\r\n * The palettes follow what the market leaders actually ship (values read from\r\n * Mappedin's own `styles.json` and Place Vendôme's abuzz scene): a very TIGHT,\r\n * HIGH-KEY value range — whites and near-whites within a few percent of each\r\n * other — with structure carried by soft tonal steps and one or two desaturated\r\n * accents, never by dark grey. Mappedin's walls are `#ffffff`, its rooms\r\n * `#f5f5f5`, its hallways `#FCFCFC`; the only saturated notes are a pale blue\r\n * (`#E6F4FB`) and a warm cream (`#F5EFE0`). Heavy mid-greys are what made the\r\n * earlier themes read as muddy, so nothing here goes below ~75% lightness.\r\n *\r\n * Every palette stays in a WARM hue family. A cool blue-grey of the same\r\n * lightness reads as an untextured CAD default rather than a material: the\r\n * leaders' only saturated notes are warm ones (Mappedin's `#F5EFE0` desks,\r\n * Place Vendôme's `#34230e` wood), because a map surface has to suggest\r\n * plaster, stone or timber to look designed rather than unfinished.\r\n *\r\n * - `ivory` — the DEFAULT: warm greige directory panels\r\n * - `data` — the venue's real editor colours for tops, walls and inner walls\r\n */\r\nexport type PolygonThemeName = 'ivory' | 'data' | 'neutral';\r\n\r\n/**\r\n * A multi-tier \"directory panel\" unit: a base band, a constant-height wall, and\r\n * a two-layer top (a lower rim with an inset upper face that holds the label).\r\n * When a theme sets this, units render as these fixed-colour panels instead of\r\n * the data-driven gradient block.\r\n */\r\nexport interface PanelStyle {\r\n /** Structural WALL / INNER_WALL height (m), constant — NOT from editor data. */\r\n wallHeight: number;\r\n /** Top section (rim + inset top face) as a FRACTION of the store's data\r\n * height; the base/wall gets the rest. Stores keep their original height. */\r\n topFraction: number;\r\n /** Width (m) of the rim between the panel edge and the inset upper face. */\r\n rimWidth: number;\r\n /**\r\n * When set, EVERY unit renders at this height (m) instead of its data\r\n * height — flush tops, one calm roofline (the Visioglobe look). The data\r\n * height still drives nothing but the selection overlay.\r\n */\r\n uniformHeight?: number;\r\n floor: string; // corridor / base-zone ground colour (keeps the map light)\r\n base: string; // store panel base-layer band at the floor\r\n edge: string; // store panel vertical edges\r\n /** WALL base layer — the flat floor plate (editor `fillColor`). */\r\n wallBase: string;\r\n /** WALL body — the actual perimeter wall band (editor `color`). */\r\n wall: string;\r\n /** INNER_WALL band — partitions carry a single colour in the data. */\r\n innerWall: string;\r\n topLower: string; // store panel top lower layer / rim\r\n topUpper: string; // store panel top upper face — inset, holds the label\r\n /** Sides of the raised top block (the bevel ring). Defaults to `edge`. */\r\n bevel?: string;\r\n /** Use each store's data/category colour for the top face instead of `topUpper`. */\r\n topUpperFromData?: boolean;\r\n /**\r\n * Use each WALL / INNER_WALL's own editor colours instead of the fixed ones:\r\n * the WALL's `fillColor` for the base layer and `color` for the wall band,\r\n * the INNER_WALL's `color` for partitions. Shapes missing a colour in the\r\n * data fall back to `wallBase` / `wall` / `innerWall`.\r\n */\r\n wallFromData?: boolean;\r\n}\r\n\r\nexport interface PolygonTheme {\r\n readonly name: PolygonThemeName;\r\n /** Store units render translucent (glass) rather than opaque. */\r\n readonly translucent: boolean;\r\n /**\r\n * Map background behind the venue. Kept in the same hue family as the panels —\r\n * a cool grey under warm ivory panels is the single fastest way to make an\r\n * otherwise good palette look cheap.\r\n */\r\n readonly background: string;\r\n /** Roof / top-face colour for a unit, given its data-driven base colour. */\r\n roof(base: THREE.Color): THREE.Color;\r\n /** Wall colour at the roof line. */\r\n wallTop(base: THREE.Color): THREE.Color;\r\n /** Wall colour at the floor — darker, to fake ambient occlusion. */\r\n wallBase(base: THREE.Color): THREE.Color;\r\n /** When set, units render as fixed-colour multi-tier panels (see PanelStyle). */\r\n panel?: PanelStyle;\r\n /** Label ink — black on light tops (ivory), white on data-coloured tops. */\r\n readonly labelColor: number;\r\n}\r\n\r\nconst WHITE = new THREE.Color(1, 1, 1);\r\nconst lighten = (c: THREE.Color, f: number): THREE.Color => c.clone().lerp(WHITE, f);\r\nconst darken = (c: THREE.Color, f: number): THREE.Color => c.clone().multiplyScalar(1 - f);\r\n/** Fixed colour, ignoring the data base — for the monochrome themes. */\r\nconst fixed = (hex: string) => (): THREE.Color => new THREE.Color(hex);\r\n\r\n/** Panel proportions — identical across themes; only the colours change. */\r\nconst PANEL_SHAPE = {\r\n wallHeight: 1.5, // structural walls, constant (~half of the old ~3m)\r\n topFraction: 0.3, // top section = 30% of the store's data height; base ≈ 70%\r\n rimWidth: 0.25, // narrow rim between the panel edge and the top face\r\n};\r\n\r\n/** The eight colours a panel palette needs, in draw order from ground to label. */\r\ninterface PanelPalette {\r\n floor: string;\r\n base: string;\r\n edge: string;\r\n wallBase: string;\r\n wall: string;\r\n innerWall: string;\r\n topLower: string;\r\n topUpper: string;\r\n bevel?: string;\r\n}\r\n\r\nconst panel = (p: PanelPalette): PanelStyle => ({ ...PANEL_SHAPE, ...p });\r\n\r\n/**\r\n * Warm ivory / greige. The tonal steps are deliberately small (each tier ~4-6%\r\n * darker than the one above) so the panel reads as one carved object catching\r\n * light, not as stacked slabs — and the top face stays near-white so the black\r\n * label keeps maximum contrast.\r\n */\r\nconst IVORY_PALETTE: PanelPalette = {\r\n floor: '#f2efe9', // warm ground — lighter than the panels sitting on it\r\n base: '#ded7cb', // greige plinth, the darkest note; grounds the panel\r\n edge: '#ece5d9', // panel sides, catching light\r\n wallBase: '#efe9df', // WALL floor plate — warm near-white\r\n wall: '#cfc7b8', // soft taupe wall: visible structure, never heavy\r\n innerWall: '#ded7ca', // partitions a step lighter than perimeter walls\r\n topLower: '#d5cdbf', // rim, deep enough to separate the top face\r\n topUpper: '#fffdf8', // warm white top face — holds the label\r\n bevel: '#fffdf8', // top layer's side walls — same colour as its top face\r\n};\r\n\r\n/** The default aesthetic look — warm, opaque ivory panels. */\r\nconst IVORY: PolygonTheme = {\r\n name: 'ivory',\r\n translucent: false,\r\n background: '#ffffff', // white map backdrop\r\n labelColor: 0x000000, // black ink on the near-white tops\r\n roof: fixed(IVORY_PALETTE.topUpper),\r\n wallTop: fixed(IVORY_PALETTE.edge),\r\n wallBase: fixed(IVORY_PALETTE.base),\r\n panel: panel(IVORY_PALETTE),\r\n};\r\n\r\n/**\r\n * The same panel, but everything colourable takes its real editor value: the\r\n * store top face, the WALL's floor plate (`fillColor`) and wall band (`color`),\r\n * and the INNER_WALL partitions (`color`). Ivory supplies the fallbacks for\r\n * shapes the editor left uncoloured.\r\n */\r\nconst DATA: PolygonTheme = {\r\n name: 'data',\r\n translucent: false,\r\n background: '#ffffff', // white map backdrop, same as ivory\r\n labelColor: 0xffffff, // white ink on the data-coloured tops (the MOQ/DFCM way)\r\n roof: (base) => lighten(base, 0.12),\r\n wallTop: (base) => darken(base, 0.05),\r\n wallBase: (base) => darken(base, 0.34),\r\n panel: {\r\n ...panel(IVORY_PALETTE),\r\n // Visioglobe policy: a WHITE slab body under a colour top, on a single\r\n // quiet cool-grey ground. Structure (walls/partitions) is nearly invisible\r\n // light grey — the coloured stores are the only thing with visual weight.\r\n floor: '#e8e9eb',\r\n base: '#ffffff',\r\n edge: '#ffffff',\r\n // the exposed top surface of the lower block — darker than the white\r\n // sides, so the ledge reads as its own layer and separates neighbours\r\n topLower: '#eaeaf4',\r\n wallBase: '#ededef',\r\n wall: '#e3e4e6',\r\n innerWall: '#e3e4e6',\r\n rimWidth: 0.3, // wide visible ledge around the coloured top — clear separation\r\n topUpperFromData: true,\r\n // NOTE: wallFromData intentionally off — raw editor wall colours break the\r\n // calm-ground rule that makes this look work.\r\n },\r\n};\r\n\r\nconst THEMES: Record<PolygonThemeName, PolygonTheme> = {\r\n ivory: IVORY,\r\n data: DATA,\r\n neutral: IVORY, // back-compat alias for the old default\r\n};\r\n\r\n/** Resolve a theme name (or undefined) to its preset — defaults to `ivory`. */\r\nexport function resolvePolygonTheme(name: PolygonThemeName | undefined): PolygonTheme {\r\n return THEMES[name ?? 'ivory'];\r\n}\r\n","import * as THREE from 'three';\r\nimport maplibregl from 'maplibre-gl';\r\nimport type { LngLat } from '../data/types.js';\r\n\r\nexport interface FrameStats {\r\n drawCalls: number;\r\n triangles: number;\r\n}\r\n\r\n/**\r\n * The ONE custom layer owning the ONE Three.js scene (extrusions, labels,\r\n * models — a single depth buffer so occlusion is always correct). MapLibre\r\n * 4.x CustomLayerInterface (`render(gl, matrix)` signature — v5 changed it;\r\n * see Phase 1 research for the version pin rationale).\r\n */\r\nexport class RenderLayer implements maplibregl.CustomLayerInterface {\r\n readonly id = 'becomap-3d';\r\n readonly type = 'custom' as const;\r\n readonly renderingMode = '3d' as const;\r\n\r\n #root: THREE.Object3D;\r\n #origin: LngLat;\r\n #camera = new THREE.Camera();\r\n #scene = new THREE.Scene();\r\n #renderer: THREE.WebGLRenderer | null = null;\r\n #originMatrix = new THREE.Matrix4();\r\n #map: maplibregl.Map | null = null;\r\n #stats: FrameStats = { drawCalls: 0, triangles: 0 };\r\n #lastMatrix = new THREE.Matrix4();\r\n #hasMatrix = false;\r\n\r\n constructor(root: THREE.Object3D, origin: LngLat) {\r\n this.#root = root;\r\n this.#origin = origin;\r\n }\r\n\r\n onAdd(map: maplibregl.Map, gl: WebGLRenderingContext | WebGL2RenderingContext): void {\r\n this.#map = map;\r\n this.#scene.add(this.#root);\r\n const mc = maplibregl.MercatorCoordinate.fromLngLat(\r\n { lng: this.#origin[0], lat: this.#origin[1] },\r\n 0,\r\n );\r\n const scale = mc.meterInMercatorCoordinateUnits();\r\n // meters (y-up after the root's rotX(-π/2)) → mercator; same construction\r\n // as the POC / official MapLibre three.js example\r\n this.#originMatrix = new THREE.Matrix4()\r\n .makeTranslation(mc.x, mc.y, mc.z)\r\n .scale(new THREE.Vector3(scale, -scale, scale))\r\n .multiply(new THREE.Matrix4().makeRotationX(Math.PI / 2));\r\n this.#renderer = new THREE.WebGLRenderer({\r\n canvas: map.getCanvas(),\r\n context: gl,\r\n antialias: true,\r\n });\r\n this.#renderer.autoClear = false;\r\n }\r\n\r\n // property (not method) to satisfy maplibre's strictly-typed interface;\r\n // matrix arrives as gl-matrix mat4 (array-like of 16 numbers)\r\n render: maplibregl.CustomRenderMethod = (_gl, matrix) => {\r\n if (!this.#renderer) return;\r\n this.#camera.projectionMatrix = new THREE.Matrix4()\r\n .fromArray(Array.from(matrix as ArrayLike<number>))\r\n .multiply(this.#originMatrix);\r\n this.#lastMatrix.copy(this.#camera.projectionMatrix);\r\n this.#hasMatrix = true;\r\n this.#renderer.resetState();\r\n this.#renderer.render(this.#scene, this.#camera);\r\n this.#stats = {\r\n drawCalls: this.#renderer.info.render.calls,\r\n triangles: this.#renderer.info.render.triangles,\r\n };\r\n };\r\n\r\n onRemove(): void {\r\n this.#scene.remove(this.#root);\r\n this.#renderer?.dispose();\r\n this.#renderer = null;\r\n this.#map = null;\r\n }\r\n\r\n repaint(): void {\r\n this.#map?.triggerRepaint();\r\n }\r\n\r\n getFrameStats(): FrameStats {\r\n return this.#stats;\r\n }\r\n\r\n /** Debug/diagnostics access to the live scene graph (not part of the public API). */\r\n debugScene(): THREE.Scene {\r\n return this.#scene;\r\n }\r\n\r\n /** Debug: the last frame's full projection matrix (clip = M · rootTransform · v). */\r\n debugMatrix(): number[] | null {\r\n return this.#hasMatrix ? this.#lastMatrix.toArray() : null;\r\n }\r\n\r\n /**\r\n * Unproject a CSS-pixel point into a RAY in the build frame (venue-local\r\n * meters, z-up) using the projection matrix of the last rendered frame.\r\n * This is what makes extruded stores clickable on their whole 3D body:\r\n * MapLibre's lngLat is the GROUND intersection, which at pitch lands behind\r\n * a tall store when the user clicks its roof or side.\r\n */\r\n /** Project a build-frame point (venue meters, z-up) to CSS-pixel screen\r\n * coordinates using the last rendered frame's matrix. Null offscreen/unready. */\r\n projectPoint(x: number, y: number, z: number): { x: number; y: number } | null {\r\n if (!this.#hasMatrix || !this.#map) return null;\r\n const canvas = this.#map.getCanvas();\r\n const w = canvas.clientWidth;\r\n const h = canvas.clientHeight;\r\n if (!w || !h) return null;\r\n const full = new THREE.Matrix4().multiplyMatrices(\r\n this.#lastMatrix,\r\n new THREE.Matrix4().makeRotationX(-Math.PI / 2),\r\n );\r\n const v = new THREE.Vector4(x, y, z, 1).applyMatrix4(full);\r\n if (v.w <= 0) return null; // behind the camera\r\n return { x: ((v.x / v.w + 1) / 2) * w, y: ((1 - v.y / v.w) / 2) * h };\r\n }\r\n\r\n pickRay(px: number, py: number): { origin: THREE.Vector3; dir: THREE.Vector3 } | null {\r\n if (!this.#hasMatrix || !this.#map) return null;\r\n const canvas = this.#map.getCanvas();\r\n const w = canvas.clientWidth;\r\n const h = canvas.clientHeight;\r\n if (!w || !h) return null;\r\n const ndcX = (px / w) * 2 - 1;\r\n const ndcY = 1 - (py / h) * 2;\r\n // clip = P · rotX(-π/2) · v_build → invert the full chain\r\n const full = new THREE.Matrix4().multiplyMatrices(\r\n this.#lastMatrix,\r\n new THREE.Matrix4().makeRotationX(-Math.PI / 2),\r\n );\r\n const inv = full.invert();\r\n const a4 = new THREE.Vector4(ndcX, ndcY, -1, 1).applyMatrix4(inv);\r\n const b4 = new THREE.Vector4(ndcX, ndcY, 1, 1).applyMatrix4(inv);\r\n if (!a4.w || !b4.w) return null;\r\n const origin = new THREE.Vector3(a4.x / a4.w, a4.y / a4.w, a4.z / a4.w);\r\n const far = new THREE.Vector3(b4.x / b4.w, b4.y / b4.w, b4.z / b4.w);\r\n const dir = far.sub(origin).normalize();\r\n return { origin, dir };\r\n }\r\n}\r\n","import * as THREE from 'three';\r\nimport type { RouteSegment } from '../routing/segments.js';\r\nimport { ringToMeters, type VenueFrame } from './coords.js';\r\nimport { SLAB_HEIGHT } from './geometry.js';\r\n\r\nconst RIBBON_WIDTH = 1.6;\r\n// start-of-route marker: the SDK's classic source pin artwork\r\nconst START_MARKER_URL =\r\n 'https://backend-lightning-prod.s3.ap-southeast-1.amazonaws.com/assets/source.svg';\r\nconst START_MARKER_PX = 54; // constant on-screen height — prominent but not overpowering\r\nconst Z_INDOOR = SLAB_HEIGHT + 0.35;\r\nconst Z_OUTDOOR = 0.35;\r\n\r\nconst RIBBON_VERTEX = /* glsl */ `\r\n varying vec2 vUv;\r\n void main() {\r\n vUv = uv;\r\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n }\r\n`;\r\n\r\n// uGhost=0 → solid pass (real depth); uGhost=1 → faint x-ray pass drawn\r\n// through walls so the occluded part of the path is never lost.\r\nconst RIBBON_FRAGMENT = /* glsl */ `\r\n uniform float uProgress;\r\n uniform float uVisited;\r\n uniform float uTime;\r\n uniform float uGhost;\r\n varying vec2 vUv; // x = arc length in meters, y = 0..1 across the ribbon\r\n void main() {\r\n float u = vUv.x;\r\n if (u > uProgress) discard;\r\n float v = abs(vUv.y - 0.5);\r\n float p = fract(u / 7.0 - uTime * 0.45);\r\n float a = 0.42 - v;\r\n float arrow = step(a * 0.55, p) * step(p, a * 0.55 + 0.16) * step(v, 0.42);\r\n float visited = 1.0 - step(uVisited, u);\r\n vec3 base = mix(vec3(0.18, 0.50, 0.93), vec3(0.66, 0.69, 0.75), visited);\r\n float arrowStrength = mix(0.95, 0.25, visited);\r\n vec3 col = mix(base, vec3(1.0), arrow * arrowStrength);\r\n // ghost: lighten toward pale blue and cut alpha so it reads as \"behind glass\"\r\n col = mix(col, vec3(0.60, 0.76, 0.98), uGhost * 0.6);\r\n float edge = smoothstep(0.5, 0.40, v);\r\n gl_FragColor = vec4(col, edge * mix(1.0, 0.30, uGhost));\r\n }\r\n`;\r\n\r\nfunction makeRibbonMaterial(ghost: boolean): THREE.ShaderMaterial {\r\n return new THREE.ShaderMaterial({\r\n transparent: true,\r\n depthWrite: false,\r\n // solid pass keeps REAL depth: the path is occluded by near walls and\r\n // reads as sitting IN the 3D world (not a flat 2D overlay). ghost pass\r\n // ignores depth to show the hidden portion faintly through walls.\r\n depthTest: !ghost,\r\n side: THREE.DoubleSide,\r\n uniforms: {\r\n uProgress: { value: 0 },\r\n uVisited: { value: 0 },\r\n uTime: { value: 0 },\r\n uGhost: { value: ghost ? 1 : 0 },\r\n },\r\n vertexShader: RIBBON_VERTEX,\r\n fragmentShader: RIBBON_FRAGMENT,\r\n });\r\n}\r\n\r\n/**\r\n * Animated route ribbon with a two-pass x-ray occlusion technique (grounded\r\n * in occlusion-reduced 3D-routing research + Google patent EP3186591A1):\r\n * - SOLID pass: normal depth test, so the path is correctly occluded by walls\r\n * in front of it and reads as a real 3D object on the floor.\r\n * - GHOST pass: depth test off + faint/pale, so wherever a wall hides the\r\n * path you still see a dim x-ray of it (obstacles stay as landmarks).\r\n * Both passes share reveal (uProgress), visited dimming (uVisited), and\r\n * flowing chevrons (uTime). Two draw calls per segment.\r\n */\r\nexport class RouteRibbon {\r\n #material = makeRibbonMaterial(false);\r\n #ghostMaterial = makeRibbonMaterial(true);\r\n #meshes: {\r\n solid: THREE.Mesh;\r\n ghost: THREE.Mesh;\r\n segment: RouteSegment;\r\n start: number;\r\n end: number;\r\n /** Spaced samples + their GLOBAL arc metres — the runner interpolates these. */\r\n pts: THREE.Vector3[];\r\n arcs: number[];\r\n }[] = [];\r\n #runner: THREE.Group | null = null;\r\n #startMarker: THREE.Mesh | null = null;\r\n #startTex: THREE.CanvasTexture | null = null;\r\n #startAspect = 0.8;\r\n #startView = { bearing: 0, pitch: 0, mpp: 0.05 };\r\n #parent: THREE.Object3D;\r\n #frame: VenueFrame;\r\n #totalLength = 0;\r\n #repaint: () => void;\r\n\r\n constructor(parent: THREE.Object3D, frame: VenueFrame, repaint: () => void = () => undefined) {\r\n this.#parent = parent;\r\n this.#frame = frame;\r\n this.#repaint = repaint;\r\n }\r\n\r\n /** Build ribbon meshes for the segments. Returns total ribbon arc length. */\r\n setRoute(segments: RouteSegment[]): number {\r\n this.clear();\r\n let offset = 0;\r\n for (const segment of segments) {\r\n const localPts = ringToMeters(this.#frame, segment.points);\r\n if (localPts.length < 2) continue;\r\n const z = segment.buildingId ? Z_INDOOR : Z_OUTDOOR;\r\n const curve = new THREE.CatmullRomCurve3(\r\n localPts.map(([x, y]) => new THREE.Vector3(x, y, z)),\r\n false,\r\n 'catmullrom',\r\n 0.05,\r\n );\r\n const length = curve.getLength();\r\n const n = Math.max(2, Math.ceil(length / 1.2));\r\n const pts = curve.getSpacedPoints(n);\r\n const pos = new Float32Array((n + 1) * 2 * 3);\r\n const uvs = new Float32Array((n + 1) * 2 * 2);\r\n const idx: number[] = [];\r\n const tan = new THREE.Vector3();\r\n let acc = offset;\r\n const arcs: number[] = [];\r\n for (let i = 0; i <= n; i++) {\r\n const p = pts[i];\r\n const prev = pts[i - 1];\r\n const next = pts[i + 1];\r\n if (!p) continue;\r\n if (i > 0 && prev) acc += p.distanceTo(prev);\r\n arcs.push(acc);\r\n if (i === 0 && next) tan.subVectors(next, p);\r\n else if (i === n && prev) tan.subVectors(p, prev);\r\n else if (prev && next) tan.subVectors(next, prev);\r\n tan.z = 0;\r\n tan.normalize();\r\n const nx = -tan.y * RIBBON_WIDTH * 0.5;\r\n const ny = tan.x * RIBBON_WIDTH * 0.5;\r\n pos.set([p.x + nx, p.y + ny, p.z, p.x - nx, p.y - ny, p.z], i * 6);\r\n uvs.set([acc, 0, acc, 1], i * 4);\r\n if (i < n) {\r\n const a = i * 2;\r\n idx.push(a, a + 1, a + 2, a + 1, a + 3, a + 2);\r\n }\r\n }\r\n const geo = new THREE.BufferGeometry();\r\n geo.setAttribute('position', new THREE.BufferAttribute(pos, 3));\r\n geo.setAttribute('uv', new THREE.BufferAttribute(uvs, 2));\r\n geo.setIndex(idx);\r\n // ghost first (behind), then solid on top where it's genuinely visible\r\n const ghost = new THREE.Mesh(geo, this.#ghostMaterial);\r\n ghost.renderOrder = 9;\r\n const solid = new THREE.Mesh(geo, this.#material);\r\n solid.renderOrder = 11;\r\n this.#parent.add(ghost, solid);\r\n this.#meshes.push({ solid, ghost, segment, start: offset, end: acc, pts, arcs });\r\n offset = acc;\r\n }\r\n this.#totalLength = offset;\r\n // plant the start pin on the route's first point\r\n const first = this.#meshes[0];\r\n const start = first?.pts[0];\r\n if (first && start) {\r\n const marker = this.#ensureStartMarker();\r\n marker.position.set(start.x, start.y, start.z + 0.05);\r\n marker.visible = true;\r\n this.#applyStartMarkerView();\r\n }\r\n return offset;\r\n }\r\n\r\n get totalLength(): number {\r\n return this.#totalLength;\r\n }\r\n\r\n get active(): boolean {\r\n return this.#meshes.length > 0;\r\n }\r\n\r\n /** Per-segment visibility (outdoor always; indoor per visible floor). */\r\n updateVisibility(isFloorVisible: (floorId: string, buildingId: string | null) => boolean): void {\r\n for (const entry of this.#meshes) {\r\n const visible =\r\n entry.segment.buildingId === null\r\n ? true\r\n : isFloorVisible(entry.segment.floorId, entry.segment.buildingId);\r\n entry.solid.visible = visible;\r\n entry.ghost.visible = visible;\r\n }\r\n // the start pin lives on the START segment's floor\r\n const first = this.#meshes[0];\r\n if (this.#startMarker && first) {\r\n this.#startMarker.visible =\r\n first.segment.buildingId === null\r\n ? true\r\n : isFloorVisible(first.segment.floorId, first.segment.buildingId);\r\n }\r\n }\r\n\r\n /** The segment END (arc metres) closest to `meters` — the true boundary the\r\n * runner must park BEFORE while a floor-change card is showing. Step\r\n * distances and ribbon arcs differ slightly (the ribbon resamples through a\r\n * curve), so callers must use the ribbon's own boundary, not the step's. */\r\n nearestBoundary(meters: number): number | null {\r\n let best: number | null = null;\r\n for (const entry of this.#meshes) {\r\n if (best === null || Math.abs(entry.end - meters) < Math.abs(best - meters)) best = entry.end;\r\n }\r\n return best;\r\n }\r\n\r\n /** Segment whose arc range contains the given progress (for floor-follow). */\r\n segmentAt(progressMeters: number): RouteSegment | undefined {\r\n return this.#meshes.find((m) => progressMeters >= m.start && progressMeters < m.end)?.segment;\r\n }\r\n\r\n #setUniform(name: 'uProgress' | 'uVisited' | 'uTime', value: number): void {\r\n const a = this.#material.uniforms[name];\r\n const b = this.#ghostMaterial.uniforms[name];\r\n if (a) a.value = value;\r\n if (b) b.value = value;\r\n }\r\n setProgress(meters: number): void {\r\n this.#setUniform('uProgress', meters);\r\n }\r\n setVisited(meters: number): void {\r\n this.#setUniform('uVisited', meters);\r\n }\r\n getVisited(): number {\r\n return (this.#material.uniforms.uVisited?.value as number | undefined) ?? 0;\r\n }\r\n setTime(seconds: number): void {\r\n this.#setUniform('uTime', seconds);\r\n }\r\n\r\n /**\r\n * Start-of-route marker: the source pin artwork on a textured quad INSIDE\r\n * the 3D scene. A THREE.Sprite cannot billboard here (the camera's view\r\n * matrix is folded into one combined projection matrix, so sprite-space\r\n * axes are not screen axes) — instead the quad is oriented every camera\r\n * move from the map's own bearing + pitch and rescaled from metres-per-\r\n * pixel to hold a constant on-screen height. Unlike a DOM marker it is\r\n * depth-tested against the venue, so walls in front genuinely occlude it.\r\n */\r\n #ensureStartMarker(): THREE.Mesh {\r\n if (this.#startMarker) return this.#startMarker;\r\n // Transparent until the artwork arrives — the texture is built ONLY once\r\n // the image is in hand. A CanvasTexture must never be resized after its\r\n // first upload: three allocates immutable GPU storage from that first\r\n // size, so a later, larger redraw silently fails to upload and the pin\r\n // renders as nothing at all.\r\n const mat = new THREE.MeshBasicMaterial({\r\n transparent: true,\r\n depthWrite: false,\r\n depthTest: false,\r\n opacity: 0,\r\n });\r\n const img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n img.onload = () => {\r\n const h = 256;\r\n const w = Math.max(2, Math.round((img.width / img.height) * h) || h);\r\n const canvas = document.createElement('canvas');\r\n canvas.width = w;\r\n canvas.height = h;\r\n canvas.getContext('2d')?.drawImage(img, 0, 0, w, h);\r\n const tex = new THREE.CanvasTexture(canvas);\r\n tex.colorSpace = THREE.SRGBColorSpace;\r\n tex.anisotropy = 4;\r\n tex.generateMipmaps = false; // level 0 only: sharper, and no mip surprises\r\n tex.minFilter = THREE.LinearFilter;\r\n this.#startTex?.dispose();\r\n this.#startTex = tex;\r\n mat.map = tex;\r\n mat.opacity = 1;\r\n mat.needsUpdate = true;\r\n this.#startAspect = w / h;\r\n this.#applyStartMarkerView();\r\n this.#repaint();\r\n };\r\n img.src = START_MARKER_URL;\r\n const geo = new THREE.PlaneGeometry(1, 1);\r\n geo.translate(0, 0.5, 0); // bottom-anchored: the pin tip sits ON the point\r\n // drawn OVER the venue (no depth test), the way Visioglobe presents its\r\n // route pins: standing on the roof but never swallowed by other buildings\r\n const mesh = new THREE.Mesh(geo, mat);\r\n mesh.renderOrder = 30;\r\n mesh.frustumCulled = false;\r\n mesh.visible = false;\r\n this.#parent.add(mesh);\r\n this.#startMarker = mesh;\r\n return mesh;\r\n }\r\n\r\n /** Stand the start pin's tip at this build-frame altitude. Routes start at\r\n * a store's node INSIDE its extruded volume, where a depth-tested pin\r\n * would be swallowed by the store's own walls — the caller lifts it onto\r\n * the store's rendered roof instead (amenity-badge style). */\r\n setStartMarkerAltitude(z: number): void {\r\n const m = this.#startMarker;\r\n if (m) m.position.z = z;\r\n }\r\n\r\n /** Feed the map camera in: bearing/pitch orient the start pin toward the\r\n * viewer, metres-per-pixel holds it at a constant on-screen height. */\r\n setStartMarkerView(bearingDeg: number, pitchDeg: number, metersPerPixel: number): void {\r\n this.#startView = { bearing: bearingDeg, pitch: pitchDeg, mpp: metersPerPixel };\r\n this.#applyStartMarkerView();\r\n }\r\n\r\n #applyStartMarkerView(): void {\r\n const m = this.#startMarker;\r\n if (!m) return;\r\n const { bearing, pitch, mpp } = this.#startView;\r\n const h = START_MARKER_PX * mpp;\r\n m.scale.set(h * this.#startAspect, h, 1);\r\n // yaw to the screen's up direction, then tip back by the camera pitch:\r\n // a billboard built from map camera parameters\r\n m.rotation.set((pitch * Math.PI) / 180, 0, (-bearing * Math.PI) / 180, 'ZXY');\r\n }\r\n\r\n /**\r\n * Lazily built 3D marker that travels the route in preview: a classic pin —\r\n * a lit cone standing tip-down on the path with a sphere head — so it reads\r\n * as a real object in the scene, not a flat decal. Route-blue, always\r\n * upright; sized ~3m so it's visible at venue zoom.\r\n */\r\n #ensureRunner(): THREE.Group {\r\n if (this.#runner) return this.#runner;\r\n const group = new THREE.Group();\r\n const mat = new THREE.MeshLambertMaterial({ color: '#2e80ee' });\r\n const cone = new THREE.ConeGeometry(0.7, 2.0, 24);\r\n cone.rotateX(-Math.PI / 2); // apex points DOWN (-z) — the pin's tip\r\n const tip = new THREE.Mesh(cone, mat);\r\n tip.position.z = 1.0; // tip touches the group origin (the path)\r\n const head = new THREE.Mesh(new THREE.SphereGeometry(0.85, 24, 18), mat);\r\n head.position.z = 2.4;\r\n group.add(tip, head);\r\n // the mercator-scale projection can misjudge tiny bounding spheres —\r\n // never let the marker be frustum-culled away\r\n group.traverse((o) => (o.frustumCulled = false));\r\n group.renderOrder = 20;\r\n group.visible = false;\r\n this.#parent.add(group);\r\n this.#runner = group;\r\n return group;\r\n }\r\n\r\n showRunner(): void {\r\n this.#ensureRunner().visible = true;\r\n }\r\n\r\n hideRunner(): void {\r\n if (this.#runner) this.#runner.visible = false;\r\n }\r\n\r\n /** Place the 3D pin at `meters` along the route (tip on the path). */\r\n setRunner(meters: number): void {\r\n const entry = this.#meshes.find((m) => meters >= m.start && meters <= m.end) ?? this.#meshes[0];\r\n if (!entry) return;\r\n const runner = this.#ensureRunner();\r\n const { pts, arcs } = entry;\r\n let i = 0;\r\n while (i < arcs.length - 1 && (arcs[i + 1] ?? Infinity) < meters) i++;\r\n const a = pts[i];\r\n const b = pts[Math.min(i + 1, pts.length - 1)];\r\n const a0 = arcs[i] ?? 0;\r\n const a1 = arcs[Math.min(i + 1, arcs.length - 1)] ?? a0;\r\n if (!a || !b) return;\r\n const t = a1 > a0 ? Math.min(1, Math.max(0, (meters - a0) / (a1 - a0))) : 0;\r\n runner.position.set(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + 0.05);\r\n }\r\n\r\n clear(): void {\r\n for (const entry of this.#meshes) {\r\n this.#parent.remove(entry.solid, entry.ghost);\r\n entry.solid.geometry.dispose(); // shared geometry — dispose once\r\n }\r\n this.#meshes = [];\r\n this.#totalLength = 0;\r\n this.hideRunner();\r\n if (this.#startMarker) this.#startMarker.visible = false;\r\n this.setProgress(0);\r\n this.setVisited(0);\r\n }\r\n\r\n dispose(): void {\r\n this.clear();\r\n if (this.#runner) {\r\n this.#parent.remove(this.#runner);\r\n this.#runner.traverse((obj) => {\r\n if (obj instanceof THREE.Mesh) {\r\n (obj.geometry as THREE.BufferGeometry).dispose();\r\n (obj.material as THREE.Material).dispose();\r\n }\r\n });\r\n this.#runner = null;\r\n }\r\n if (this.#startMarker) {\r\n this.#parent.remove(this.#startMarker);\r\n this.#startMarker.geometry.dispose();\r\n (this.#startMarker.material as THREE.Material).dispose();\r\n this.#startMarker = null;\r\n }\r\n this.#startTex?.dispose();\r\n this.#startTex = null;\r\n this.#material.dispose();\r\n this.#ghostMaterial.dispose();\r\n }\r\n}\r\n","import type { Venue } from '../data/venue-model.js';\n\n/** Zoom at/after which buildings open automatically. */\nexport const OPEN_ZOOM = 16.2;\n/** Below this zoom, click-opened buildings reset (hysteresis). */\nexport const CLOSE_ZOOM = 15.4;\n\nexport interface BuildingView {\n open: boolean;\n floorId: string;\n}\n\nexport interface ViewChange {\n buildingId: string;\n view: BuildingView;\n}\n\n/**\n * Pure LOD/floor state machine: derives per-building views (sealed shell vs\n * one visible floor) from the zoom level, click-opens, and floor selection.\n * The renderer applies the returned changes; no three.js/maplibre in here.\n */\nexport class FloorManager {\n #venue: Venue;\n #openZoom: number;\n #closeZoom: number;\n #zoom = 0;\n #selected = new Map<string, string>(); // buildingId -> floorId\n #manualOpen = new Set<string>();\n #focusedBuildingId: string | null = null;\n #lastViews = new Map<string, BuildingView>();\n\n constructor(venue: Venue, options: { openZoom?: number; closeZoom?: number } = {}) {\n this.#venue = venue;\n this.#openZoom = options.openZoom ?? OPEN_ZOOM;\n this.#closeZoom = options.closeZoom ?? CLOSE_ZOOM;\n for (const b of venue.buildings) {\n const ground = b.floors[0];\n if (ground) this.#selected.set(b.id, ground.id);\n }\n this.#focusedBuildingId = venue.buildings[0]?.id ?? null;\n }\n\n focusedBuildingId(): string | null {\n return this.#focusedBuildingId;\n }\n\n focusBuilding(buildingId: string): void {\n if (this.#venue.getBuilding(buildingId)) this.#focusedBuildingId = buildingId;\n }\n\n viewOf(buildingId: string): BuildingView | undefined {\n return this.#computeView(buildingId);\n }\n\n views(): Map<string, BuildingView> {\n const out = new Map<string, BuildingView>();\n for (const b of this.#venue.buildings) {\n const v = this.#computeView(b.id);\n if (v) out.set(b.id, v);\n }\n return out;\n }\n\n /** Zoom moved (continuous). Returns the views that changed. */\n update(zoom: number): ViewChange[] {\n this.#zoom = zoom;\n return this.#diff();\n }\n\n /** Zoom settled. Below the close threshold, manual opens reset. */\n onZoomEnd(zoom: number): ViewChange[] {\n this.#zoom = zoom;\n if (zoom < this.#closeZoom && this.#manualOpen.size > 0) this.#manualOpen.clear();\n return this.#diff();\n }\n\n /** Click on a sealed building: open it (persists until reseal). */\n clickOpen(buildingId: string): ViewChange[] {\n if (!this.#venue.getBuilding(buildingId)) return [];\n this.#manualOpen.add(buildingId);\n this.#focusedBuildingId = buildingId;\n return this.#diff();\n }\n\n /**\n * Select a floor by id. Focuses its building; selecting a floor of a\n * sealed building opens it (POC behavior).\n */\n selectFloor(floorId: string): ViewChange[] {\n const floor = this.#venue.getFloor(floorId);\n if (!floor) return [];\n this.#selected.set(floor.buildingId, floorId);\n this.#focusedBuildingId = floor.buildingId;\n const view = this.#computeView(floor.buildingId);\n if (view && !view.open) this.#manualOpen.add(floor.buildingId);\n return this.#diff();\n }\n\n #isOpen(buildingId: string): boolean {\n return this.#zoom >= this.#openZoom || this.#manualOpen.has(buildingId);\n }\n\n #computeView(buildingId: string): BuildingView | undefined {\n const floorId = this.#selected.get(buildingId);\n if (floorId === undefined) return undefined;\n return { open: this.#isOpen(buildingId), floorId };\n }\n\n #diff(): ViewChange[] {\n const changes: ViewChange[] = [];\n for (const b of this.#venue.buildings) {\n const next = this.#computeView(b.id);\n if (!next) continue;\n const prev = this.#lastViews.get(b.id);\n if (!prev || prev.open !== next.open || prev.floorId !== next.floorId) {\n changes.push({ buildingId: b.id, view: next });\n this.#lastViews.set(b.id, next);\n }\n }\n return changes;\n }\n}\n","import type { Building } from '../data/types.js';\nimport type { BuildingView } from '../lod/floor-manager.js';\n\n/**\n * Built-in floor switcher control (top-right): shows the focused building's\n * name and one button per floor, bottom-up like an elevator panel. Selecting\n * a floor of a sealed building opens it. Inline-styled — no CSS import\n * required by consumers. Disable via `createMap(..., { ui: { floorSwitcher:\n * false } })`.\n */\nexport interface FloorSwitcher {\n update(building: Building | null, view: BuildingView | undefined): void;\n dispose(): void;\n}\n\nexport function createFloorSwitcher(\n container: HTMLElement,\n onSelect: (floorId: string) => void,\n): FloorSwitcher {\n const el = document.createElement('div');\n el.style.cssText =\n 'position:absolute;top:12px;right:12px;z-index:10;background:rgba(255,255,255,.92);' +\n 'border-radius:10px;padding:10px 12px;font-family:system-ui,sans-serif;font-size:12px;' +\n 'color:#1f2937;box-shadow:0 2px 12px rgba(0,0,0,.12);text-align:center;display:none';\n const name = document.createElement('div');\n name.style.cssText = 'font-weight:600;margin-bottom:6px;max-width:110px';\n const buttons = document.createElement('div');\n buttons.style.cssText = 'display:flex;flex-direction:column-reverse;gap:4px';\n el.append(name, buttons);\n container.appendChild(el);\n\n return {\n update(building, view): void {\n if (!building) {\n el.style.display = 'none';\n return;\n }\n el.style.display = 'block';\n name.textContent = building.name;\n buttons.replaceChildren();\n for (const floor of building.floors) {\n const btn = document.createElement('button');\n btn.textContent = floor.name;\n const active = view?.open === true && view.floorId === floor.id;\n btn.style.cssText =\n 'width:44px;height:32px;margin:0 auto;border:1px solid #d1d5db;border-radius:8px;' +\n 'font-size:13px;font-weight:600;cursor:pointer;' +\n (active ? 'background:#0d9488;border-color:#0d9488;color:#fff' : 'background:#fff;color:#1f2937');\n btn.onclick = () => {\n onSelect(floor.id);\n };\n buttons.appendChild(btn);\n }\n },\n dispose(): void {\n el.remove();\n },\n };\n}\n","import type { Venue } from '../data/venue-model.js';\r\nimport type { BuildingView } from '../lod/floor-manager.js';\r\nimport { pointInRing } from '../render/coords.js';\r\nimport type { LngLat, Shape, VenueLocation } from '../data/types.js';\r\n\r\nexport type ClickTarget =\r\n | { kind: 'sealed'; buildingId: string; ring: LngLat[] }\r\n | {\r\n kind: 'store';\r\n buildingId: string;\r\n floorId: string;\r\n location: VenueLocation;\r\n shape: Shape;\r\n }\r\n | { kind: 'corridor'; buildingId: string }\r\n | { kind: 'outdoor' };\r\n\r\n/**\r\n * Pure click resolution against the venue model + current LOD views:\r\n * - inside a sealed building's footprint → 'sealed'\r\n * - inside an open building: on a unit shape of the VISIBLE floor with a\r\n * linked location → 'store'; otherwise → 'corridor'\r\n * - anywhere else → 'outdoor'\r\n */\r\nexport function resolveClick(\r\n venue: Venue,\r\n viewOf: (buildingId: string) => BuildingView | undefined,\r\n lng: number,\r\n lat: number,\r\n): ClickTarget {\r\n for (const building of venue.buildings) {\r\n const view = viewOf(building.id);\r\n if (!view) continue;\r\n const footprint = building.floors[0]?.shapes.find(\r\n (s) => (s.layerId === 'footprint' || s.type.toUpperCase() === 'WALL') && s.geometry.type === 'Polygon',\r\n );\r\n const ring = footprint?.geometry.type === 'Polygon' ? footprint.geometry.coordinates[0] : undefined;\r\n if (!ring || !pointInRing(ring, lng, lat)) continue;\r\n\r\n if (!view.open) return { kind: 'sealed', buildingId: building.id, ring };\r\n\r\n const floor = building.floors.find((f) => f.id === view.floorId);\r\n if (floor) {\r\n const locationByShapeId = new Map<string, VenueLocation>();\r\n for (const loc of floor.locations) {\r\n if (loc.shapeId) locationByShapeId.set(loc.shapeId, loc);\r\n }\r\n for (const shape of floor.shapes) {\r\n if (shape.layerId === 'footprint' || shape.geometry.type !== 'Polygon') continue;\r\n const shapeRing = shape.geometry.coordinates[0];\r\n if (!shapeRing || !pointInRing(shapeRing, lng, lat)) continue;\r\n const location = locationByShapeId.get(shape.id);\r\n if (location && !location.hidden) {\r\n return { kind: 'store', buildingId: building.id, floorId: floor.id, location, shape };\r\n }\r\n }\r\n }\r\n return { kind: 'corridor', buildingId: building.id };\r\n }\r\n return { kind: 'outdoor' };\r\n}\r\n","import type { Venue } from '../data/venue-model.js';\nimport type { VenueLocation } from '../data/types.js';\n\nexport interface SearchResult {\n location: VenueLocation;\n /** Higher is better: matched tokens + full-prefix bonuses. */\n score: number;\n}\n\ninterface IndexEntry {\n location: VenueLocation;\n nameTokens: string[];\n categoryTokens: string[];\n}\n\n/** Lowercase + strip diacritics (NFD) + split on non-alphanumerics. */\nexport function tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .split(/[^a-z0-9]+/)\n .filter((t) => t.length > 0);\n}\n\n/**\n * Search index over venue locations: built once at load, queried with\n * diacritic-insensitive token-prefix matching (every query token must\n * prefix-match a name or category token). Queries yield to the event loop\n * every CHUNK entries so even stress-scale venues never block input.\n */\nexport class SearchIndex {\n static CHUNK = 500;\n #entries: IndexEntry[] = [];\n\n constructor(venue: Venue) {\n for (const location of venue.locations) {\n if (location.hidden) continue;\n this.#entries.push({\n location,\n nameTokens: tokenize(location.name),\n categoryTokens: location.categories.flatMap((c) => tokenize(c.name)),\n });\n }\n }\n\n get size(): number {\n return this.#entries.length;\n }\n\n async query(text: string): Promise<SearchResult[]> {\n const queryTokens = tokenize(text);\n if (queryTokens.length === 0) return [];\n const results: SearchResult[] = [];\n for (let i = 0; i < this.#entries.length; i++) {\n if (i > 0 && i % SearchIndex.CHUNK === 0) {\n await new Promise((resolve) => setTimeout(resolve, 0)); // yield\n }\n const entry = this.#entries[i];\n if (!entry) continue;\n const score = scoreEntry(entry, queryTokens);\n if (score > 0) results.push({ location: entry.location, score });\n }\n results.sort(\n (a, b) => b.score - a.score || a.location.sortOrder - b.location.sortOrder,\n );\n return results;\n }\n\n byCategory(categoryId: string): VenueLocation[] {\n return this.#entries\n .filter((e) => e.location.categories.some((c) => c.id === categoryId))\n .map((e) => e.location)\n .sort((a, b) => a.sortOrder - b.sortOrder);\n }\n}\n\nfunction scoreEntry(entry: IndexEntry, queryTokens: string[]): number {\n let score = 0;\n const candidates = [...entry.nameTokens, ...entry.categoryTokens];\n const used = new Set<number>();\n for (const q of queryTokens) {\n let matched = -1;\n for (let i = 0; i < candidates.length; i++) {\n if (used.has(i)) continue;\n const c = candidates[i];\n if (c !== undefined && c.startsWith(q)) {\n matched = i;\n break;\n }\n }\n if (matched === -1) return 0; // every query token must match\n used.add(matched);\n score += 1 + (candidates[matched] === q ? 0.5 : 0); // exact-token bonus\n }\n return score;\n}\n","/**\n * A* over the venue routing graph.\n *\n * IMPORTANT: `runAStar` must remain fully self-contained (no imports, no\n * closure captures) — it is stringified into a Blob worker by the route\n * service, so everything it needs lives inside the function body. The same\n * function runs inline as the no-Worker fallback and in unit tests.\n */\n\nexport interface SerializedGraphNode {\n lng: number;\n lat: number;\n edges: { to: string; cost: number; accessible: boolean }[];\n}\n\nexport type SerializedGraph = Record<string, SerializedGraphNode>;\n\nexport interface AStarResult {\n path: string[];\n cost: number;\n}\n\nexport function runAStar(\n graph: SerializedGraph,\n fromId: string,\n toId: string,\n accessibleOnly: boolean,\n): AStarResult | null {\n const start = graph[fromId];\n const goal = graph[toId];\n if (!start || !goal) return null;\n\n const R = 6371000;\n const toRad = Math.PI / 180;\n const heuristic = (a: { lng: number; lat: number }, b: { lng: number; lat: number }): number => {\n const dLat = (b.lat - a.lat) * toRad;\n const dLng = (b.lng - a.lng) * toRad;\n const s =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(a.lat * toRad) * Math.cos(b.lat * toRad) * Math.sin(dLng / 2) ** 2;\n return 2 * R * Math.asin(Math.sqrt(s));\n };\n\n // binary min-heap keyed by fScore\n const heapIds: string[] = [];\n const heapF: number[] = [];\n const push = (id: string, f: number): void => {\n heapIds.push(id);\n heapF.push(f);\n let i = heapIds.length - 1;\n while (i > 0) {\n const p = (i - 1) >> 1;\n const hf = heapF[p];\n const cf = heapF[i];\n if (hf === undefined || cf === undefined || hf <= cf) break;\n [heapF[p], heapF[i]] = [cf, hf];\n const pid = heapIds[p];\n const cid = heapIds[i];\n if (pid !== undefined && cid !== undefined) {\n heapIds[p] = cid;\n heapIds[i] = pid;\n }\n i = p;\n }\n };\n const pop = (): string | undefined => {\n if (heapIds.length === 0) return undefined;\n const top = heapIds[0];\n const lastId = heapIds.pop();\n const lastF = heapF.pop();\n if (heapIds.length > 0 && lastId !== undefined && lastF !== undefined) {\n heapIds[0] = lastId;\n heapF[0] = lastF;\n let i = 0;\n for (;;) {\n const l = i * 2 + 1;\n const r = l + 1;\n let smallest = i;\n const fi = heapF[i] ?? Infinity;\n const fl = heapF[l] ?? Infinity;\n const fr = heapF[r] ?? Infinity;\n if (l < heapF.length && fl < fi) smallest = l;\n if (r < heapF.length && fr < (heapF[smallest] ?? Infinity)) smallest = r;\n if (smallest === i) break;\n const si = heapIds[smallest];\n const ii = heapIds[i];\n const sf = heapF[smallest];\n const iff = heapF[i];\n if (si === undefined || ii === undefined || sf === undefined || iff === undefined) break;\n heapIds[i] = si;\n heapIds[smallest] = ii;\n heapF[i] = sf;\n heapF[smallest] = iff;\n i = smallest;\n }\n }\n return top;\n };\n\n const gScore = new Map<string, number>();\n const cameFrom = new Map<string, string>();\n const closed = new Set<string>();\n gScore.set(fromId, 0);\n push(fromId, heuristic(start, goal));\n\n for (;;) {\n const current = pop();\n if (current === undefined) return null;\n if (current === toId) break;\n if (closed.has(current)) continue;\n closed.add(current);\n const node = graph[current];\n if (!node) continue;\n const g = gScore.get(current) ?? Infinity;\n for (const edge of node.edges) {\n if (accessibleOnly && !edge.accessible) continue;\n const neighbor = graph[edge.to];\n if (!neighbor || closed.has(edge.to)) continue;\n const tentative = g + edge.cost;\n if (tentative < (gScore.get(edge.to) ?? Infinity)) {\n gScore.set(edge.to, tentative);\n cameFrom.set(edge.to, current);\n push(edge.to, tentative + heuristic(neighbor, goal));\n }\n }\n }\n\n const path: string[] = [toId];\n let cursor = toId;\n while (cursor !== fromId) {\n const prev = cameFrom.get(cursor);\n if (prev === undefined) return null;\n path.push(prev);\n cursor = prev;\n }\n path.reverse();\n return { path, cost: gScore.get(toId) ?? 0 };\n}\n","import { runAStar, type AStarResult, type SerializedGraph } from './astar.js';\nimport type { Venue } from '../data/venue-model.js';\n\n/**\n * Main-thread routing entry: LRU-cached A* executed in a Blob Web Worker\n * (never blocking input), with a synchronous inline fallback where Workers\n * don't exist (tests/SSR). The worker source is generated by stringifying\n * the self-contained `runAStar` — no bundler worker plumbing required in\n * either the SDK build or consumer builds.\n */\nexport class RouteService {\n #graph: SerializedGraph;\n #worker: Worker | null = null;\n #pending = new Map<number, (result: AStarResult | null) => void>();\n #nextId = 1;\n #cache = new Map<string, AStarResult | null>();\n static CACHE_MAX = 100;\n\n constructor(venue: Venue) {\n this.#graph = serializeGraph(venue);\n if (typeof Worker !== 'undefined' && typeof URL.createObjectURL === 'function') {\n try {\n const source =\n `const runAStar = ${runAStar.toString()};\\n` +\n `let graph = null;\\n` +\n `self.onmessage = (e) => {\\n` +\n ` const msg = e.data;\\n` +\n ` if (msg.type === 'init') { graph = msg.graph; return; }\\n` +\n ` const result = graph ? runAStar(graph, msg.from, msg.to, msg.accessibleOnly) : null;\\n` +\n ` self.postMessage({ id: msg.id, result });\\n` +\n `};`;\n const url = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));\n this.#worker = new Worker(url);\n URL.revokeObjectURL(url);\n this.#worker.onmessage = (e: MessageEvent<{ id: number; result: AStarResult | null }>) => {\n const resolve = this.#pending.get(e.data.id);\n if (resolve) {\n this.#pending.delete(e.data.id);\n resolve(e.data.result);\n }\n };\n this.#worker.postMessage({ type: 'init', graph: this.#graph });\n } catch {\n this.#worker = null; // CSP or worker failure → inline fallback\n }\n }\n }\n\n get usingWorker(): boolean {\n return this.#worker !== null;\n }\n\n async findPath(\n fromNodeId: string,\n toNodeId: string,\n options: { accessibleOnly?: boolean } = {},\n ): Promise<AStarResult | null> {\n const accessibleOnly = options.accessibleOnly ?? false;\n const key = `${fromNodeId}|${toNodeId}|${String(accessibleOnly)}`;\n const cached = this.#cache.get(key);\n if (cached !== undefined) {\n // refresh LRU position\n this.#cache.delete(key);\n this.#cache.set(key, cached);\n return cached;\n }\n const result = this.#worker\n ? await new Promise<AStarResult | null>((resolve) => {\n const id = this.#nextId++;\n this.#pending.set(id, resolve);\n this.#worker?.postMessage({ id, from: fromNodeId, to: toNodeId, accessibleOnly });\n })\n : runAStar(this.#graph, fromNodeId, toNodeId, accessibleOnly);\n if (this.#cache.size >= RouteService.CACHE_MAX) {\n const oldest = this.#cache.keys().next().value;\n if (oldest !== undefined) this.#cache.delete(oldest);\n }\n this.#cache.set(key, result);\n return result;\n }\n\n dispose(): void {\n this.#worker?.terminate();\n this.#worker = null;\n this.#pending.clear();\n this.#cache.clear();\n }\n}\n\nfunction serializeGraph(venue: Venue): SerializedGraph {\n const graph: SerializedGraph = {};\n for (const node of venue.nodes) {\n graph[node.id] = {\n lng: node.lng,\n lat: node.lat,\n edges: node.edges.map((e) => ({ to: e.toNodeId, cost: e.cost, accessible: e.accessible })),\n };\n }\n return graph;\n}\n","import type {\r\n Building,\r\n Category,\r\n Floor,\r\n FloorConnectionKind,\r\n GraphNode,\r\n MapObjectDef,\r\n Shape,\r\n VenueData,\r\n VenueLocation,\r\n VenueStats,\r\n} from './types.js';\r\n\r\n/** Great-circle distance in meters (sufficient accuracy at venue scale). */\r\nexport function haversineMeters(lng1: number, lat1: number, lng2: number, lat2: number): number {\r\n const R = 6371000;\r\n const toRad = Math.PI / 180;\r\n const dLat = (lat2 - lat1) * toRad;\r\n const dLng = (lng2 - lng1) * toRad;\r\n const a =\r\n Math.sin(dLat / 2) ** 2 + Math.cos(lat1 * toRad) * Math.cos(lat2 * toRad) * Math.sin(dLng / 2) ** 2;\r\n return 2 * R * Math.asin(Math.sqrt(a));\r\n}\r\n\r\n/**\r\n * The built, indexed venue model. Instance-scoped (never a singleton),\r\n * immutable by convention after {@link buildVenue} returns.\r\n */\r\nexport class Venue {\r\n readonly id: string;\r\n readonly name: string;\r\n readonly center: [number, number];\r\n readonly buildings: Building[];\r\n readonly categories: Category[];\r\n readonly mapObjects: MapObjectDef[];\r\n /** Default icon set (key -> SVG url) — markers resolve amenity icons here. */\r\n readonly iconset: Record<string, string>;\r\n\r\n readonly #buildingsById = new Map<string, Building>();\r\n readonly #floorsById = new Map<string, Floor>();\r\n readonly #locationsById = new Map<string, VenueLocation>();\r\n readonly #shapesById = new Map<string, Shape>();\r\n readonly #nodesById = new Map<string, GraphNode>();\r\n readonly #categoriesById = new Map<string, Category>();\r\n #edgeCount = 0;\r\n\r\n constructor(data: {\r\n id: string;\r\n name: string;\r\n center: [number, number];\r\n buildings: Building[];\r\n categories: Category[];\r\n mapObjects: MapObjectDef[];\r\n iconset?: Record<string, string>;\r\n nodes: GraphNode[];\r\n shapes: Shape[];\r\n locations: VenueLocation[];\r\n edgeCount: number;\r\n }) {\r\n this.id = data.id;\r\n this.name = data.name;\r\n this.center = data.center;\r\n this.buildings = data.buildings;\r\n this.categories = data.categories;\r\n this.mapObjects = data.mapObjects;\r\n this.iconset = data.iconset ?? {};\r\n this.#edgeCount = data.edgeCount;\r\n for (const b of data.buildings) {\r\n this.#buildingsById.set(b.id, b);\r\n for (const f of b.floors) this.#floorsById.set(f.id, f);\r\n }\r\n for (const c of data.categories) this.#categoriesById.set(c.id, c);\r\n for (const n of data.nodes) this.#nodesById.set(n.id, n);\r\n for (const s of data.shapes) this.#shapesById.set(s.id, s);\r\n for (const l of data.locations) this.#locationsById.set(l.id, l);\r\n }\r\n\r\n getBuilding(id: string): Building | undefined {\r\n return this.#buildingsById.get(id);\r\n }\r\n getFloor(id: string): Floor | undefined {\r\n return this.#floorsById.get(id);\r\n }\r\n getLocation(id: string): VenueLocation | undefined {\r\n return this.#locationsById.get(id);\r\n }\r\n getShape(id: string): Shape | undefined {\r\n return this.#shapesById.get(id);\r\n }\r\n getNode(id: string): GraphNode | undefined {\r\n return this.#nodesById.get(id);\r\n }\r\n getCategory(id: string): Category | undefined {\r\n return this.#categoriesById.get(id);\r\n }\r\n\r\n get locations(): IterableIterator<VenueLocation> {\r\n return this.#locationsById.values();\r\n }\r\n get nodes(): IterableIterator<GraphNode> {\r\n return this.#nodesById.values();\r\n }\r\n\r\n stats(): VenueStats {\r\n return {\r\n buildings: this.buildings.length,\r\n floors: this.#floorsById.size,\r\n locations: this.#locationsById.size,\r\n shapes: this.#shapesById.size,\r\n nodes: this.#nodesById.size,\r\n edges: this.#edgeCount,\r\n categories: this.#categoriesById.size,\r\n mapObjects: this.mapObjects.length,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Build the indexed venue model from raw provider data: derive location\r\n * floors, group entities per floor, and assemble the routing graph (sibling\r\n * edges with haversine costs; cross-floor edges from floor connections with\r\n * kind penalties).\r\n */\r\nexport function buildVenue(data: VenueData): Venue {\r\n // --- graph nodes ---------------------------------------------------------\r\n const nodes = new Map<string, GraphNode>();\r\n for (const rn of data.nodes) {\r\n nodes.set(rn.id, {\r\n id: rn.id,\r\n lng: rn.lng,\r\n lat: rn.lat,\r\n floorId: rn.floorId,\r\n accessible: rn.accessible,\r\n privateNode: rn.privateNode,\r\n edges: [],\r\n });\r\n }\r\n let edgeCount = 0;\r\n const addEdge = (\r\n from: GraphNode,\r\n to: GraphNode,\r\n cost: number,\r\n accessible: boolean,\r\n kind?: FloorConnectionKind,\r\n ): void => {\r\n if (from.edges.some((e) => e.toNodeId === to.id)) return;\r\n from.edges.push(\r\n kind\r\n ? { toNodeId: to.id, cost, accessible, connectionKind: kind }\r\n : { toNodeId: to.id, cost, accessible },\r\n );\r\n edgeCount++;\r\n };\r\n // Sibling edges: directed as listed (editor data lists both directions;\r\n // the mock generator does too). Cost = geodesic meters.\r\n for (const rn of data.nodes) {\r\n const from = nodes.get(rn.id);\r\n if (!from) continue;\r\n for (const sib of rn.siblings) {\r\n const to = nodes.get(sib);\r\n if (!to) continue;\r\n addEdge(from, to, haversineMeters(from.lng, from.lat, to.lng, to.lat), true);\r\n }\r\n }\r\n // Connection edges: editor cost rule, per-direction (v1 #processConnections).\r\n for (const fc of data.floorConnections) {\r\n const start = nodes.get(fc.startNodeId);\r\n const end = nodes.get(fc.endNodeId);\r\n if (!start || !end) continue; // v1 skips connections referencing unknown nodes\r\n const cost = (fc.weight > 0 ? fc.weight : 100) * (fc.multiplier || 1);\r\n if (fc.direction === 'startToEnd' || fc.direction === 'both') {\r\n addEdge(start, end, cost, fc.accessible, fc.kind);\r\n }\r\n if (fc.direction === 'endToStart' || fc.direction === 'both') {\r\n addEdge(end, start, cost, fc.accessible, fc.kind);\r\n }\r\n }\r\n\r\n // --- categories -----------------------------------------------------------\r\n const categories = new Map<string, Category>();\r\n for (const rc of data.categories) {\r\n const cat: Category = { id: rc.id, name: rc.name, sortOrder: rc.sortOrder };\r\n if (rc.icon !== undefined) cat.icon = rc.icon;\r\n if (rc.colorHex !== undefined) cat.colorHex = rc.colorHex;\r\n categories.set(rc.id, cat);\r\n }\r\n\r\n // --- shapes ---------------------------------------------------------------\r\n const shapes = new Map<string, Shape>();\r\n for (const rs of data.shapes) {\r\n const shape: Shape = {\r\n id: rs.id,\r\n floorId: rs.floorId,\r\n layerId: rs.layerId,\r\n type: rs.type,\r\n geometry: rs.geometry,\r\n };\r\n if (rs.style) shape.style = rs.style;\r\n shapes.set(rs.id, shape);\r\n }\r\n\r\n // --- locations (derive floor from node, else shape) -----------------------\r\n const locations = new Map<string, VenueLocation>();\r\n for (const rl of data.locations) {\r\n const nodeFloor = rl.nodeId ? nodes.get(rl.nodeId)?.floorId : undefined;\r\n const shapeFloor = rl.shapeId ? shapes.get(rl.shapeId)?.floorId : undefined;\r\n const floorId = nodeFloor ?? shapeFloor;\r\n const loc: VenueLocation = {\r\n id: rl.id,\r\n name: rl.name,\r\n type: rl.type,\r\n categories: rl.categoryIds\r\n .map((id) => categories.get(id))\r\n .filter((c): c is Category => c !== undefined),\r\n hidden: rl.hidden,\r\n sortOrder: rl.sortOrder,\r\n };\r\n if (rl.description !== undefined) loc.description = rl.description;\r\n if (rl.nodeId !== undefined) loc.nodeId = rl.nodeId;\r\n if (rl.shapeId !== undefined) loc.shapeId = rl.shapeId;\r\n if (floorId !== undefined) loc.floorId = floorId;\r\n if (rl.amenity !== undefined) loc.amenity = rl.amenity;\r\n if (rl.logoUrl !== undefined) loc.logoUrl = rl.logoUrl;\r\n locations.set(rl.id, loc);\r\n }\r\n\r\n // v1 synthesizes a selectable location at each connection endpoint that\r\n // lacks one (type 'connection', amenity = kind) so elevators/escalators are\r\n // addressable in search/selection.\r\n const locationByNodeId = new Map<string, VenueLocation>();\r\n for (const loc of locations.values()) {\r\n if (loc.nodeId) locationByNodeId.set(loc.nodeId, loc);\r\n }\r\n for (const fc of data.floorConnections) {\r\n for (const nid of [fc.startNodeId, fc.endNodeId]) {\r\n const node = nodes.get(nid);\r\n if (!node || locationByNodeId.has(nid)) continue;\r\n const loc: VenueLocation = {\r\n id: `conn-${fc.id}-${nid}`,\r\n name: fc.name ?? fc.kind,\r\n type: 'connection',\r\n nodeId: nid,\r\n floorId: node.floorId,\r\n amenity: fc.kind,\r\n categories: [],\r\n hidden: false,\r\n sortOrder: 0,\r\n };\r\n locations.set(loc.id, loc);\r\n locationByNodeId.set(nid, loc);\r\n }\r\n }\r\n\r\n // --- buildings & floors, with per-floor groupings --------------------------\r\n const floorLocations = new Map<string, VenueLocation[]>();\r\n for (const loc of locations.values()) {\r\n if (!loc.floorId) continue;\r\n const list = floorLocations.get(loc.floorId) ?? [];\r\n list.push(loc);\r\n floorLocations.set(loc.floorId, list);\r\n }\r\n const floorShapes = new Map<string, Shape[]>();\r\n for (const s of shapes.values()) {\r\n const list = floorShapes.get(s.floorId) ?? [];\r\n list.push(s);\r\n floorShapes.set(s.floorId, list);\r\n }\r\n const floorNodes = new Map<string, GraphNode[]>();\r\n for (const n of nodes.values()) {\r\n const list = floorNodes.get(n.floorId) ?? [];\r\n list.push(n);\r\n floorNodes.set(n.floorId, list);\r\n }\r\n\r\n const buildings: Building[] = data.buildings.map((rb) => ({\r\n id: rb.id,\r\n name: rb.name,\r\n floors: [...rb.floors]\r\n .sort((a, b) => a.level - b.level)\r\n .map((rf) => ({\r\n id: rf.id,\r\n name: rf.name,\r\n level: rf.level,\r\n buildingId: rf.buildingId,\r\n locations: floorLocations.get(rf.id) ?? [],\r\n shapes: floorShapes.get(rf.id) ?? [],\r\n nodes: floorNodes.get(rf.id) ?? [],\r\n })),\r\n }));\r\n\r\n const mapObjects: MapObjectDef[] = data.mapObjects.map((m) => ({ ...m }));\r\n\r\n return new Venue({\r\n id: data.site.id,\r\n name: data.site.name,\r\n center: data.site.center,\r\n buildings,\r\n categories: [...categories.values()].sort((a, b) => a.sortOrder - b.sortOrder),\r\n mapObjects,\r\n nodes: [...nodes.values()],\r\n shapes: [...shapes.values()],\r\n locations: [...locations.values()],\r\n edgeCount,\r\n ...(data.iconset ? { iconset: data.iconset } : {}),\r\n });\r\n}\r\n","import type { Venue } from '../data/venue-model.js';\r\nimport type { FloorConnectionKind, LngLat } from '../data/types.js';\r\nimport { haversineMeters } from '../data/venue-model.js';\r\n\r\nexport interface RouteSegment {\r\n /** Floor the segment lives on ('outdoor' pseudo-floors have buildingId null). */\r\n floorId: string;\r\n buildingId: string | null;\r\n points: LngLat[];\r\n /** Connection used to LEAVE this segment (elevator/escalator/...), if any. */\r\n exitKind?: FloorConnectionKind;\r\n /** Graph node id per point — keeps landmarks resolvable from a step. */\r\n nodeIds: string[];\r\n}\r\n\r\n/** What happens AT a step. Mirrors the v1 SDK's step-action semantics. */\r\nexport type StepAction =\r\n | 'depart'\r\n | 'turn'\r\n | 'continue'\r\n | 'floorChange'\r\n | 'exitBuilding'\r\n | 'enterBuilding'\r\n | 'arrive';\r\n\r\n/** Which way to go at a step. `up`/`down` accompany a floor change. */\r\nexport type StepDirection =\r\n | 'none'\r\n | 'straight'\r\n | 'slightLeft'\r\n | 'left'\r\n | 'uTurnLeft'\r\n | 'slightRight'\r\n | 'right'\r\n | 'uTurnRight'\r\n | 'up'\r\n | 'down';\r\n\r\nexport interface RouteStep {\r\n lng: number;\r\n lat: number;\r\n floorId: string;\r\n buildingId: string | null;\r\n segmentIndex: number;\r\n /** Cumulative meters from the route start (matches ribbon arc length). */\r\n cumMeters: number;\r\n /** Ready-to-show English instruction, built from the fields below. */\r\n label: string;\r\n /** Structured action, so hosts can localise or draw their own UI. */\r\n action: StepAction;\r\n /** Structured direction — the turn this step calls for. */\r\n direction: StepDirection;\r\n /** Meters covered from THIS step to the next (0 at the destination). */\r\n distanceMeters: number;\r\n /** Graph node this step sits on. */\r\n nodeId: string;\r\n /** Named location at this step, for \"turn right at Zara\" (null when none). */\r\n landmark: string | null;\r\n}\r\n\r\nexport interface BuiltRoute {\r\n segments: RouteSegment[];\r\n steps: RouteStep[];\r\n totalMeters: number;\r\n}\r\n\r\nfunction buildingIdForFloor(venue: Venue, floorId: string): string | null {\r\n return venue.getFloor(floorId)?.buildingId ?? null;\r\n}\r\n\r\n/**\r\n * Compass bearing a→b in degrees. Longitude is scaled by cos(lat) so the angle\r\n * is a TRUE bearing — without it, turn angles are stretched by the latitude\r\n * factor and a slight bend can be classified as a full turn.\r\n */\r\nfunction bearingDeg(a: LngLat, b: LngLat): number {\r\n const cosLat = Math.cos((((a[1] + b[1]) / 2) * Math.PI) / 180);\r\n return (Math.atan2((b[0] - a[0]) * cosLat, b[1] - a[1]) * 180) / Math.PI;\r\n}\r\n\r\n/** Signed bearing change in (-180, 180]: positive = right, negative = left. */\r\nfunction bearingDelta(from: number, to: number): number {\r\n return ((to - from + 540) % 360) - 180;\r\n}\r\n\r\n/** Bucket a bearing change into a named turn (v1's thresholds). */\r\nfunction turnFor(delta: number): StepDirection {\r\n if (delta >= -10 && delta <= 10) return 'straight';\r\n if (delta > 135) return 'uTurnRight';\r\n if (delta > 45) return 'right';\r\n if (delta > 10) return 'slightRight';\r\n if (delta < -135) return 'uTurnLeft';\r\n if (delta < -45) return 'left';\r\n return 'slightLeft';\r\n}\r\n\r\n/** Below this the bend is path noise, not an instruction worth a step. */\r\nconst TURN_MIN_DEG = 25;\r\n\r\n/**\r\n * Longest leg a single instruction may cover. A straight run of 87 m told as\r\n * one step (\"walk 87 m\") is useless to follow — beyond this the run is broken\r\n * into even legs so the walker gets a fresh confirmation every ~30 m.\r\n */\r\nconst MAX_LEG_M = 35;\r\n\r\n/** How far a leg break may shift to land on a real node (and keep a landmark). */\r\nconst SNAP_M = 2;\r\n\r\nconst TURN_PHRASE: Record<string, string> = {\r\n slightRight: 'Slight right',\r\n right: 'Turn right',\r\n uTurnRight: 'Make a U-turn',\r\n slightLeft: 'Slight left',\r\n left: 'Turn left',\r\n uTurnLeft: 'Make a U-turn',\r\n};\r\n\r\nfunction formatMeters(m: number): string {\r\n return `${String(Math.max(1, Math.round(m)))} m`;\r\n}\r\n\r\n/**\r\n * Split an A* node path into per-floor segments and turn-by-turn steps with\r\n * instruction labels. Steps keep segment boundaries + genuine turns (>25°).\r\n */\r\nexport function buildRoute(\r\n venue: Venue,\r\n path: string[],\r\n names: { origin: string; destination: string },\r\n): BuiltRoute | null {\r\n const nodes = path\r\n .map((id) => venue.getNode(id))\r\n .filter((n): n is NonNullable<typeof n> => n !== undefined);\r\n if (nodes.length < 2) return null;\r\n\r\n // --- segments by floor ------------------------------------------------------\r\n const segments: RouteSegment[] = [];\r\n let current: RouteSegment | null = null;\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n if (!node) continue;\r\n if (!current || current.floorId !== node.floorId) {\r\n // record which connection kind leaves the previous segment\r\n if (current && i > 0) {\r\n const prev = nodes[i - 1];\r\n const edge = prev?.edges.find((e) => e.toNodeId === node.id);\r\n if (edge?.connectionKind) current.exitKind = edge.connectionKind;\r\n }\r\n current = {\r\n floorId: node.floorId,\r\n buildingId: buildingIdForFloor(venue, node.floorId),\r\n points: [],\r\n nodeIds: [],\r\n };\r\n segments.push(current);\r\n }\r\n current.points.push([node.lng, node.lat]);\r\n current.nodeIds.push(node.id);\r\n }\r\n\r\n // landmark lookup: a NAMED, non-amenity location sitting on a node makes a\r\n // far better instruction anchor (\"turn right at Zara\") than coordinates\r\n const landmarkByNode = new Map<string, string>();\r\n for (const loc of venue.locations) {\r\n if (!loc.nodeId || loc.amenity || loc.hidden || !loc.name) continue;\r\n if (!landmarkByNode.has(loc.nodeId)) landmarkByNode.set(loc.nodeId, loc.name);\r\n }\r\n\r\n // --- cumulative meters + steps ----------------------------------------------\r\n // Every path point with its running distance; steps are CHOSEN from these,\r\n // so a leg can later be split at a real node instead of an invented point.\r\n interface PathPoint {\r\n lng: number;\r\n lat: number;\r\n floorId: string;\r\n buildingId: string | null;\r\n segmentIndex: number;\r\n cum: number;\r\n nodeId: string;\r\n direction: StepDirection;\r\n isStep: boolean;\r\n }\r\n const pts: PathPoint[] = [];\r\n let cum = 0;\r\n\r\n segments.forEach((segment, segmentIndex) => {\r\n for (let i = 0; i < segment.points.length; i++) {\r\n const p = segment.points[i];\r\n if (!p) continue;\r\n if (i > 0) {\r\n const prev = segment.points[i - 1];\r\n if (prev) cum += haversineMeters(prev[0], prev[1], p[0], p[1]);\r\n }\r\n const isSegmentEdge = i === 0 || i === segment.points.length - 1;\r\n let direction: StepDirection = 'none';\r\n let isTurn = false;\r\n if (!isSegmentEdge) {\r\n const prev = segment.points[i - 1];\r\n const next = segment.points[i + 1];\r\n if (prev && next) {\r\n const delta = bearingDelta(bearingDeg(prev, p), bearingDeg(p, next));\r\n if (Math.abs(delta) > TURN_MIN_DEG) {\r\n direction = turnFor(delta);\r\n isTurn = true;\r\n }\r\n }\r\n }\r\n pts.push({\r\n lng: p[0],\r\n lat: p[1],\r\n floorId: segment.floorId,\r\n buildingId: segment.buildingId,\r\n segmentIndex,\r\n cum,\r\n nodeId: segment.nodeIds[i] ?? '',\r\n direction,\r\n isStep: isSegmentEdge || isTurn,\r\n });\r\n }\r\n });\r\n\r\n // Break over-long legs into EVEN parts (87 m → 3 × 29 m, not 35+35+17), each\r\n // break snapped to the nearest real path node so it keeps a landmark.\r\n const stepIdx: number[] = [];\r\n pts.forEach((pt, i) => {\r\n if (pt.isStep) stepIdx.push(i);\r\n });\r\n const extras: PathPoint[] = [];\r\n for (let k = 1; k < stepIdx.length; k++) {\r\n const from = stepIdx[k - 1];\r\n const to = stepIdx[k];\r\n if (from === undefined || to === undefined) continue;\r\n const a = pts[from];\r\n const b = pts[to];\r\n if (!a || !b) continue;\r\n const run = b.cum - a.cum;\r\n if (run <= MAX_LEG_M) continue;\r\n const parts = Math.ceil(run / MAX_LEG_M);\r\n for (let n = 1; n < parts; n++) {\r\n const target = a.cum + (run * n) / parts;\r\n // A real node right at the mark is preferable — it carries a landmark.\r\n // The window is deliberately TIGHT: snapping further would skew the even\r\n // division and leave an over-long leg after the break.\r\n let best: PathPoint | undefined;\r\n let bestDiff = SNAP_M;\r\n for (let i = from + 1; i < to; i++) {\r\n const pt = pts[i];\r\n if (!pt) continue;\r\n const diff = Math.abs(pt.cum - target);\r\n if (diff <= bestDiff) {\r\n bestDiff = diff;\r\n best = pt;\r\n }\r\n }\r\n if (best) {\r\n best.isStep = true;\r\n continue;\r\n }\r\n // otherwise place the break exactly on the mark, interpolating along the\r\n // polyline (between the two points that bracket it — NOT across the whole\r\n // run, which would cut corners on a bent path)\r\n let lo = from;\r\n for (let i = from; i < to; i++) {\r\n if ((pts[i]?.cum ?? 0) <= target) lo = i;\r\n }\r\n const p0 = pts[lo];\r\n const p1 = pts[Math.min(lo + 1, to)];\r\n if (!p0 || !p1) continue;\r\n const span = p1.cum - p0.cum;\r\n const f = span > 0 ? (target - p0.cum) / span : 0;\r\n extras.push({\r\n lng: p0.lng + (p1.lng - p0.lng) * f,\r\n lat: p0.lat + (p1.lat - p0.lat) * f,\r\n floorId: p0.floorId,\r\n buildingId: p0.buildingId,\r\n segmentIndex: p0.segmentIndex,\r\n cum: target,\r\n nodeId: '',\r\n direction: 'none',\r\n isStep: true,\r\n });\r\n }\r\n }\r\n\r\n const steps: RouteStep[] = [...pts, ...extras]\r\n .sort((x, y) => x.cum - y.cum)\r\n .filter((pt) => pt.isStep)\r\n .map((pt) => ({\r\n lng: pt.lng,\r\n lat: pt.lat,\r\n floorId: pt.floorId,\r\n buildingId: pt.buildingId,\r\n segmentIndex: pt.segmentIndex,\r\n cumMeters: pt.cum,\r\n label: '',\r\n action: 'continue',\r\n direction: pt.direction,\r\n distanceMeters: 0,\r\n nodeId: pt.nodeId,\r\n landmark: landmarkByNode.get(pt.nodeId) ?? null,\r\n }));\r\n\r\n // dedupe consecutive same-place steps UNLESS they represent a floor change\r\n const deduped: RouteStep[] = [];\r\n for (const step of steps) {\r\n const prev = deduped[deduped.length - 1];\r\n const samePlace =\r\n prev !== undefined &&\r\n haversineMeters(prev.lng, prev.lat, step.lng, step.lat) < 0.5 &&\r\n prev.floorId === step.floorId;\r\n if (samePlace) continue;\r\n deduped.push(step);\r\n }\r\n\r\n // --- action, distance, and instruction label ---------------------------------\r\n const buildingName = (id: string | null): string =>\r\n (id ? venue.getBuilding(id)?.name : undefined) ?? 'outside';\r\n const floorName = (floorId: string): string => venue.getFloor(floorId)?.name ?? floorId;\r\n const floorLevel = (floorId: string): number => venue.getFloor(floorId)?.level ?? 0;\r\n for (let i = 0; i < deduped.length; i++) {\r\n const step = deduped[i];\r\n const next = deduped[i + 1];\r\n if (!step) continue;\r\n // how far the walker covers on the leg this step opens\r\n step.distanceMeters = next ? Math.max(0, next.cumMeters - step.cumMeters) : 0;\r\n const run = step.distanceMeters >= 1 ? formatMeters(step.distanceMeters) : '';\r\n\r\n if (i === 0) {\r\n step.action = 'depart';\r\n step.direction = 'none';\r\n step.label = run ? `Start at ${names.origin}, then walk ${run}` : `Start at ${names.origin}`;\r\n } else if (i === deduped.length - 1) {\r\n step.action = 'arrive';\r\n step.direction = 'none';\r\n step.label = `Arrive at ${names.destination}`;\r\n } else if (next && step.buildingId && next.buildingId === step.buildingId && next.floorId !== step.floorId) {\r\n const kind = segments[step.segmentIndex]?.exitKind ?? 'elevator';\r\n step.action = 'floorChange';\r\n step.direction = floorLevel(next.floorId) > floorLevel(step.floorId) ? 'up' : 'down';\r\n step.label = `Take the ${kind} to ${floorName(next.floorId)}`;\r\n } else if (next && step.buildingId && !next.buildingId) {\r\n step.action = 'exitBuilding';\r\n step.direction = 'none';\r\n step.label = `Exit ${buildingName(step.buildingId)}`;\r\n } else if (!step.buildingId && next?.buildingId) {\r\n step.action = 'enterBuilding';\r\n step.direction = 'none';\r\n step.label = `Enter ${buildingName(next.buildingId)}`;\r\n } else if (step.direction !== 'none' && step.direction !== 'straight') {\r\n // a REAL turn instruction — the direction was measured at build time\r\n step.action = 'turn';\r\n const phrase = TURN_PHRASE[step.direction] ?? 'Turn';\r\n const at = step.landmark ? ` at ${step.landmark}` : '';\r\n step.label = run ? `${phrase}${at}, then ${run}` : `${phrase}${at}`;\r\n } else {\r\n step.action = 'continue';\r\n step.direction = 'straight';\r\n const where = step.buildingId ? '' : ' outside';\r\n step.label = run ? `Continue${where} for ${run}` : `Continue${where}`;\r\n }\r\n }\r\n\r\n return { segments, steps: deduped, totalMeters: cum };\r\n}\r\n","import type maplibregl from 'maplibre-gl';\r\nimport type { RouteRibbon } from '../render/route-ribbon.js';\r\nimport type { RouteSegment, RouteStep, StepAction, StepDirection } from './segments.js';\r\nimport { haversineMeters } from '../data/venue-model.js';\r\n\r\nexport const PREVIEW_ZOOM = 18;\r\nexport const STEP_ZOOM = 18.2;\r\nexport const NAV_PITCH = 32;\r\n// Preview pacing: duration-bounded so LONG routes don't drag — the runner\r\n// covers any route in 4-8s (speed scales with length), instead of a fixed\r\n// walking pace that took forever on big venues.\r\nconst RUN_MPS = 4;\r\n// Pause at each floor connection: the runner stops, the instruction card shows\r\n// (1.6s, owned by the SDK host), the card closes, THEN the floor switches.\r\nconst TRANSITION_PAUSE_MS = 1800;\r\nconst PREVIEW_MIN_S = 5;\r\n// Arrival dwell: the runner STANDS at the destination (camera there, on the\r\n// destination floor) before the camera hands over to step navigation — ending\r\n// the same frame the runner arrived made the destination flash past unseen.\r\nconst END_DWELL_MS = 2000;\r\nconst PREVIEW_MAX_S = 12;\r\nconst VISITED_LERP = 0.08;\r\n\r\nexport interface NavStepInfo {\r\n index: number;\r\n total: number;\r\n label: string;\r\n isFirst: boolean;\r\n isLast: boolean;\r\n /** Structured action — localise or draw your own UI from this, not the label. */\r\n action: StepAction;\r\n /** Structured direction (turn / up / down). */\r\n direction: StepDirection;\r\n /** Meters covered from this step to the next (0 at the destination). */\r\n distanceMeters: number;\r\n /** Floor this step is on. */\r\n floorId: string;\r\n /** Named location at this step, when the step sits on one. */\r\n landmark: string | null;\r\n}\r\n\r\n/** Position along the raw segment polyline at a cumulative distance. */\r\nexport function routePointAt(segments: RouteSegment[], meters: number): [number, number] | null {\r\n let cum = 0;\r\n for (const segment of segments) {\r\n for (let i = 1; i < segment.points.length; i++) {\r\n const a = segment.points[i - 1];\r\n const b = segment.points[i];\r\n if (!a || !b) continue;\r\n const len = haversineMeters(a[0], a[1], b[0], b[1]);\r\n if (cum + len >= meters && len > 0) {\r\n const t = (meters - cum) / len;\r\n return [a[0] + (b[0] - a[0]) * t, a[1] + (b[1] - a[1]) * t];\r\n }\r\n cum += len;\r\n }\r\n }\r\n const last = segments[segments.length - 1];\r\n const p = last?.points[last.points.length - 1];\r\n return p ? [p[0], p[1]] : null;\r\n}\r\n\r\n/**\r\n * The polyline the walker covers for one step: route points between two\r\n * cumulative distances, bracketed by the interpolated start/end positions.\r\n */\r\nexport function routeSubpath(\r\n segments: RouteSegment[],\r\n startMeters: number,\r\n endMeters: number,\r\n): [number, number][] {\r\n const out: [number, number][] = [];\r\n const start = routePointAt(segments, startMeters);\r\n if (start) out.push(start);\r\n let cum = 0;\r\n for (const segment of segments) {\r\n for (let i = 1; i < segment.points.length; i++) {\r\n const a = segment.points[i - 1];\r\n const b = segment.points[i];\r\n if (!a || !b) continue;\r\n cum += haversineMeters(a[0], a[1], b[0], b[1]);\r\n if (cum > startMeters && cum < endMeters) out.push([b[0], b[1]]);\r\n }\r\n }\r\n const end = routePointAt(segments, endMeters);\r\n if (end) out.push(end);\r\n return out;\r\n}\r\n\r\nconst LEG_PADDING = { top: 90, bottom: 180, left: 70, right: 70 };\r\nconst LEG_MAX_ZOOM = 19;\r\n\r\n/** Camera that frames a leg's polyline heading-up; null if it can't be framed. */\r\nfunction frameLeg(map: maplibregl.Map, pts: [number, number][], bearing: number) {\r\n if (pts.length < 2) return null;\r\n let minLng = Infinity;\r\n let minLat = Infinity;\r\n let maxLng = -Infinity;\r\n let maxLat = -Infinity;\r\n for (const [lng, lat] of pts) {\r\n if (lng < minLng) minLng = lng;\r\n if (lng > maxLng) maxLng = lng;\r\n if (lat < minLat) minLat = lat;\r\n if (lat > maxLat) maxLat = lat;\r\n }\r\n // a single point (e.g. a floor-change leg) has no extent to frame\r\n if (maxLng - minLng < 1e-9 && maxLat - minLat < 1e-9) return null;\r\n return (\r\n map.cameraForBounds(\r\n [\r\n [minLng, minLat],\r\n [maxLng, maxLat],\r\n ],\r\n { bearing, padding: LEG_PADDING, maxZoom: LEG_MAX_ZOOM },\r\n ) ?? null\r\n );\r\n}\r\n\r\n/**\r\n * Preview → step-by-step navigation state machine (POC-final behaviors):\r\n * preview reveals at walking pace (duration clamped 4–15s), the camera\r\n * follows the reveal head WITHOUT rotating, floors auto-switch along the\r\n * journey, then the camera returns to the start and Next/Previous take over\r\n * with heading-up bearing per step and a smoothly tweening visited boundary.\r\n */\r\nexport class NavigationController {\r\n #map: maplibregl.Map;\r\n #ribbon: RouteRibbon;\r\n #segments: RouteSegment[];\r\n #steps: RouteStep[];\r\n #showFloor: (floorId: string) => void;\r\n #onStep: (info: NavStepInfo) => void;\r\n #repaint: () => void;\r\n\r\n #state: 'preview' | 'step' | 'disposed' = 'preview';\r\n #onTransition: (t: { kind: string; toFloorId: string } | null) => void = () => undefined;\r\n #transitions: { cumMeters: number; kind: string; toFloorId: string }[] = [];\r\n #nextTransition = 0;\r\n #pauseUntil = 0;\r\n #pauseAt = 0;\r\n #endDwellUntil = 0;\r\n #currentStep = 0;\r\n #visitedTarget = 0;\r\n #revealStartMs = 0;\r\n #revealSpeed = RUN_MPS;\r\n #raf = 0;\r\n\r\n constructor(deps: {\r\n map: maplibregl.Map;\r\n ribbon: RouteRibbon;\r\n segments: RouteSegment[];\r\n steps: RouteStep[];\r\n showFloor: (floorId: string) => void;\r\n onStep: (info: NavStepInfo) => void;\r\n repaint: () => void;\r\n onTransition?: (t: { kind: string; toFloorId: string } | null) => void;\r\n }) {\r\n this.#map = deps.map;\r\n this.#ribbon = deps.ribbon;\r\n this.#segments = deps.segments;\r\n this.#steps = deps.steps;\r\n this.#showFloor = deps.showFloor;\r\n this.#onStep = deps.onStep;\r\n this.#repaint = deps.repaint;\r\n this.#onTransition = deps.onTransition ?? ((): void => undefined);\r\n // floor-change steps get an instruction card as the runner reaches them:\r\n // structured data (kind + destination floor), no parsing of label text\r\n this.#transitions = this.#steps\r\n .filter((st) => st.action === 'floorChange')\r\n .map((st) => ({\r\n cumMeters: st.cumMeters,\r\n kind: this.#segments[st.segmentIndex]?.exitKind ?? 'elevator',\r\n toFloorId: this.#segments[st.segmentIndex + 1]?.floorId ?? st.floorId,\r\n }));\r\n }\r\n\r\n get active(): boolean {\r\n return this.#state !== 'disposed';\r\n }\r\n\r\n start(): void {\r\n // the route is FULLY drawn immediately (no progressive reveal) …\r\n this.#ribbon.setProgress(this.#ribbon.totalLength);\r\n this.#ribbon.setVisited(0);\r\n this.#visitedTarget = 0;\r\n // … then the runner preview plays over it\r\n this.preview();\r\n this.#tick();\r\n }\r\n\r\n /**\r\n * Preview: a \"running person\" badge travels the fully-drawn route from start\r\n * to end (camera following, floors auto-switching), then hands over to step\r\n * navigation. Public — callable again any time to replay the journey.\r\n */\r\n preview(): void {\r\n if (this.#state === 'disposed') return;\r\n const first = this.#steps[0];\r\n if (!first || this.#ribbon.totalLength <= 0) return;\r\n if (first.buildingId) this.#showFloor(first.floorId);\r\n this.#map.easeTo({\r\n center: [first.lng, first.lat],\r\n zoom: PREVIEW_ZOOM,\r\n pitch: NAV_PITCH,\r\n duration: 800,\r\n });\r\n const total = this.#ribbon.totalLength;\r\n const duration = Math.min(PREVIEW_MAX_S, Math.max(PREVIEW_MIN_S, total / RUN_MPS));\r\n this.#revealSpeed = total / duration;\r\n this.#revealStartMs = performance.now() + 900; // runner sets off after the glide\r\n this.#ribbon.setRunner(0);\r\n this.#ribbon.showRunner();\r\n this.#nextTransition = 0;\r\n this.#pauseUntil = 0;\r\n this.#endDwellUntil = 0;\r\n this.#onTransition(null);\r\n this.#state = 'preview';\r\n }\r\n\r\n /** Leave the preview early (user stepped or replayed): park the runner. */\r\n #endPreview(): void {\r\n this.#ribbon.hideRunner();\r\n this.#onTransition(null);\r\n this.#state = 'step';\r\n }\r\n\r\n stepInfo(): NavStepInfo {\r\n const step = this.#steps[this.#currentStep];\r\n return {\r\n index: this.#currentStep,\r\n total: this.#steps.length,\r\n label: step?.label ?? '',\r\n isFirst: this.#currentStep === 0,\r\n isLast: this.#currentStep === this.#steps.length - 1,\r\n action: step?.action ?? 'continue',\r\n direction: step?.direction ?? 'none',\r\n distanceMeters: step?.distanceMeters ?? 0,\r\n floorId: step?.floorId ?? '',\r\n landmark: step?.landmark ?? null,\r\n };\r\n }\r\n\r\n next(): void {\r\n if (this.#state === 'preview') this.#endPreview();\r\n this.goToStep(this.#currentStep + 1);\r\n }\r\n previous(): void {\r\n if (this.#state === 'preview') this.#endPreview();\r\n this.goToStep(this.#currentStep - 1);\r\n }\r\n\r\n goToStep(index: number): void {\r\n if (this.#state !== 'step') return;\r\n this.#currentStep = Math.max(0, Math.min(this.#steps.length - 1, index));\r\n const step = this.#steps[this.#currentStep];\r\n if (!step) return;\r\n this.#visitedTarget = step.cumMeters;\r\n if (step.buildingId) this.#showFloor(step.floorId);\r\n // heading-up: face the next step far enough away to define a bearing\r\n let bearing: number | undefined;\r\n for (let j = this.#currentStep + 1; j < this.#steps.length; j++) {\r\n const nx = this.#steps[j];\r\n if (nx && haversineMeters(step.lng, step.lat, nx.lng, nx.lat) > 1) {\r\n bearing = (Math.atan2(nx.lng - step.lng, nx.lat - step.lat) * 180) / Math.PI;\r\n break;\r\n }\r\n }\r\n if (bearing === undefined) {\r\n for (let j = this.#currentStep - 1; j >= 0; j--) {\r\n const pv = this.#steps[j];\r\n if (pv && haversineMeters(pv.lng, pv.lat, step.lng, step.lat) > 1) {\r\n bearing = (Math.atan2(step.lng - pv.lng, step.lat - pv.lat) * 180) / Math.PI;\r\n break;\r\n }\r\n }\r\n }\r\n // Focus + zoom to the whole leg the walker covers for this step (from here\r\n // to the next step), framed heading-up — instead of just centering a point.\r\n const nextStep = this.#steps[this.#currentStep + 1];\r\n const endMeters = nextStep ? nextStep.cumMeters : this.#ribbon.totalLength;\r\n const leg = routeSubpath(this.#segments, step.cumMeters, endMeters);\r\n const framed = frameLeg(this.#map, leg, bearing ?? this.#map.getBearing());\r\n if (framed) {\r\n this.#map.easeTo({ ...framed, pitch: NAV_PITCH, duration: 700 });\r\n } else {\r\n // degenerate leg (floor change / single point): center on the step\r\n this.#map.easeTo({\r\n center: [step.lng, step.lat],\r\n zoom: STEP_ZOOM,\r\n pitch: NAV_PITCH,\r\n ...(bearing !== undefined ? { bearing } : {}),\r\n duration: 700,\r\n });\r\n }\r\n this.#onStep(this.stepInfo());\r\n }\r\n\r\n dispose(): void {\r\n this.#state = 'disposed';\r\n this.#onTransition(null);\r\n cancelAnimationFrame(this.#raf);\r\n }\r\n\r\n #tick = (): void => {\r\n if (this.#state === 'disposed') return;\r\n this.#ribbon.setTime(performance.now() / 1000); // flowing chevrons along the route\r\n\r\n if (this.#state === 'preview') {\r\n const now = performance.now();\r\n let progress: number;\r\n if (now < this.#pauseUntil) {\r\n // parked at the connection while the instruction card is up — the\r\n // runner waits just BEFORE the boundary so the floor doesn't switch yet\r\n progress = this.#pauseAt;\r\n } else {\r\n const elapsed = (now - this.#revealStartMs) / 1000;\r\n progress = Math.max(0, Math.min(this.#ribbon.totalLength, elapsed * this.#revealSpeed));\r\n // reaching a floor connection: show the card, freeze here, and shift\r\n // the timeline so the journey resumes from this exact point after the\r\n // card has closed — only THEN does the floor change\r\n const tr = this.#transitions[this.#nextTransition];\r\n // trigger at whichever comes FIRST: the step's metre-mark or the\r\n // ribbon's own segment boundary (they drift slightly apart — waiting\r\n // for the later one lets a frame slip onto the next floor early)\r\n const boundary = tr ? (this.#ribbon.nearestBoundary(tr.cumMeters) ?? tr.cumMeters) : 0;\r\n const trigger = tr ? Math.min(tr.cumMeters, Math.max(0, boundary - 0.05)) : 0;\r\n if (tr && progress >= trigger) {\r\n this.#onTransition({ kind: tr.kind, toFloorId: tr.toFloorId });\r\n // park BEFORE the boundary so the floor cannot switch until the card closes\r\n this.#pauseAt = trigger;\r\n this.#pauseUntil = now + TRANSITION_PAUSE_MS;\r\n this.#revealStartMs = now + TRANSITION_PAUSE_MS - (this.#pauseAt / this.#revealSpeed) * 1000;\r\n this.#nextTransition++;\r\n progress = this.#pauseAt;\r\n }\r\n }\r\n this.#ribbon.setRunner(progress); // the person runs the fully-drawn route\r\n if (progress > 0 && progress < this.#ribbon.totalLength) {\r\n const head = routePointAt(this.#segments, progress);\r\n if (head) this.#map.setCenter(head); // follow, no rotation (POC-final)\r\n const segment = this.#ribbon.segmentAt(progress);\r\n if (segment?.buildingId) this.#showFloor(segment.floorId);\r\n } else if (progress >= this.#ribbon.totalLength) {\r\n if (this.#endDwellUntil === 0) {\r\n // ARRIVED: park the runner ON the destination, make sure the\r\n // destination floor is the visible one, and settle the camera there\r\n this.#endDwellUntil = now + END_DWELL_MS;\r\n const lastStep = this.#steps[this.#steps.length - 1];\r\n if (lastStep?.buildingId) this.#showFloor(lastStep.floorId);\r\n if (lastStep) {\r\n this.#map.easeTo({ center: [lastStep.lng, lastStep.lat], duration: 500 });\r\n }\r\n } else if (now >= this.#endDwellUntil) {\r\n // journey shown: the camera STAYS at the destination, but the\r\n // walkthrough is primed at the FIRST step (\"Start at …\") — nothing\r\n // is marked visited and no camera/floor change happens until the\r\n // user actually steps forward\r\n this.#endDwellUntil = 0;\r\n this.#endPreview();\r\n this.#ribbon.setVisited(0);\r\n this.#visitedTarget = 0;\r\n this.#currentStep = 0;\r\n this.#onStep(this.stepInfo());\r\n }\r\n }\r\n } else {\r\n const current = this.#ribbon.getVisited();\r\n const nextValue = Math.abs(current - this.#visitedTarget) < 0.05\r\n ? this.#visitedTarget\r\n : current + (this.#visitedTarget - current) * VISITED_LERP;\r\n this.#ribbon.setVisited(nextValue);\r\n }\r\n\r\n this.#repaint();\r\n this.#raf = requestAnimationFrame(this.#tick);\r\n };\r\n}\r\n","import type { NavStepInfo } from '../routing/navigation.js';\r\n\r\n/**\r\n * Built-in navigation bar (bottom center): ◀ · Step i/n + instruction · ▶ ·\r\n * ✕. Clearing the route goes ONLY through the ✕ (ROUT-07). Inline styles;\r\n * disable via `options.ui.routeBar: false`.\r\n */\r\nexport interface RouteBar {\r\n update(info: NavStepInfo): void;\r\n dispose(): void;\r\n}\r\n\r\n/** Direction glyph for the current instruction — reads at a glance. */\r\nconst DIRECTION_GLYPH: Record<string, string> = {\r\n slightLeft: '↖', // ↖\r\n left: '←', // ←\r\n uTurnLeft: '↰', // ↰\r\n slightRight: '↗', // ↗\r\n right: '→', // →\r\n uTurnRight: '↱', // ↱\r\n straight: '↑', // ↑\r\n up: '⇧', // ⇧\r\n down: '⇩', // ⇩\r\n};\r\n\r\nexport function createRouteBar(\r\n container: HTMLElement,\r\n handlers: { onPrev: () => void; onNext: () => void; onClear: () => void },\r\n): RouteBar {\r\n const el = document.createElement('div');\r\n el.style.cssText =\r\n 'position:absolute;bottom:24px;left:50%;transform:translateX(-50%);z-index:10;display:flex;' +\r\n 'align-items:center;gap:10px;background:#1f2937;color:#fff;border-radius:999px;padding:8px 14px;' +\r\n 'font-family:system-ui,sans-serif;box-shadow:0 2px 12px rgba(0,0,0,.25)';\r\n const btn = (label: string, onClick: () => void, danger = false): HTMLButtonElement => {\r\n const b = document.createElement('button');\r\n b.textContent = label;\r\n b.style.cssText =\r\n `background:${danger ? '#7f1d1d' : '#374151'};color:#fff;border:none;border-radius:999px;` +\r\n 'width:38px;height:38px;font-size:15px;font-weight:700;cursor:pointer';\r\n b.onclick = onClick;\r\n return b;\r\n };\r\n const prev = btn('◀', handlers.onPrev);\r\n const next = btn('▶', handlers.onNext);\r\n const clear = btn('✕', handlers.onClear, true);\r\n const info = document.createElement('div');\r\n info.style.cssText = 'text-align:center;min-width:170px;font-size:12px;line-height:1.35';\r\n const stepEl = document.createElement('b');\r\n stepEl.style.fontSize = '13px';\r\n const glyphEl = document.createElement('span');\r\n glyphEl.style.cssText = 'font-size:15px;font-weight:700;margin-right:5px';\r\n const actionEl = document.createElement('span');\r\n info.append(stepEl, document.createElement('br'), glyphEl, actionEl);\r\n el.append(prev, info, next, clear);\r\n container.appendChild(el);\r\n\r\n return {\r\n update(state: NavStepInfo): void {\r\n stepEl.textContent = `Step ${String(state.index + 1)} / ${String(state.total)}`;\r\n glyphEl.textContent = DIRECTION_GLYPH[state.direction] ?? '';\r\n actionEl.textContent = state.label;\r\n prev.disabled = state.isFirst;\r\n next.disabled = state.isLast;\r\n prev.style.opacity = state.isFirst ? '0.35' : '1';\r\n next.style.opacity = state.isLast ? '0.35' : '1';\r\n },\r\n dispose(): void {\r\n el.remove();\r\n },\r\n };\r\n}\r\n","/**\r\n * Namespaced facade stubs. Each facade is a typed surface whose methods are\r\n * filled in by later phases; until then they throw a descriptive error so\r\n * consumers get a clear signal instead of silent no-ops.\r\n */\r\n\r\nimport type { Emitter, BecoMapEvents } from '../events.js';\r\nimport type { VenueProvider } from '../data/provider.js';\r\nimport type { VenueStats } from '../data/types.js';\r\nimport { buildVenue, Venue } from '../data/venue-model.js';\r\n\r\n/** Venue data access: loading and model lookups. */\r\nexport interface VenueFacade {\r\n /** Fetch venue data via the configured provider and build the model. */\r\n load(): Promise<VenueStats>;\r\n /** The built venue model, or null before {@link VenueFacade.load} resolves. */\r\n current(): Venue | null;\r\n /** Convenience: model stats, or null before load. */\r\n stats(): VenueStats | null;\r\n}\r\n\r\nexport function createVenueFacade(deps: {\r\n provider?: VenueProvider;\r\n emitter: Emitter<BecoMapEvents>;\r\n signal: AbortSignal;\r\n onLoaded?: (venue: Venue) => void;\r\n}): VenueFacade {\r\n let venue: Venue | null = null;\r\n return {\r\n async load(): Promise<VenueStats> {\r\n if (!deps.provider) {\r\n throw new Error('becomap: no venue provider configured — pass options.venue.provider to createMap');\r\n }\r\n try {\r\n const data = await deps.provider.fetchVenue(deps.signal);\r\n venue = buildVenue(data);\r\n deps.onLoaded?.(venue);\r\n return venue.stats();\r\n } catch (cause) {\r\n const message = cause instanceof Error ? cause.message : 'venue load failed';\r\n deps.emitter.emit('error', { message, cause });\r\n throw cause;\r\n }\r\n },\r\n current: () => venue,\r\n stats: () => venue?.stats() ?? null,\r\n };\r\n}\r\n\r\nimport type { BuildingView } from '../lod/floor-manager.js';\r\n\r\n/** Floor visibility and selection (live since Phase 4). */\r\nexport interface FloorsFacade {\r\n /** Show a floor (opens its building if sealed, focuses it). */\r\n select(floorId: string): void;\r\n /** Building whose floors the built-in switcher controls. */\r\n focusedBuildingId(): string | null;\r\n /** Current LOD view of a building (sealed vs open + visible floor). */\r\n viewOf(buildingId: string): BuildingView | undefined;\r\n}\r\nexport function createFloorsFacade(deps: {\r\n select: (floorId: string) => void;\r\n focusedBuildingId: () => string | null;\r\n viewOf: (buildingId: string) => BuildingView | undefined;\r\n}): FloorsFacade {\r\n return {\r\n select: deps.select,\r\n focusedBuildingId: deps.focusedBuildingId,\r\n viewOf: deps.viewOf,\r\n };\r\n}\r\n\r\nimport type { SearchResult } from '../search/index.js';\r\nimport type { VenueLocation } from '../data/types.js';\r\n\r\n/** Location search (live since Phase 5). */\r\nexport interface SearchFacade {\r\n /** Token-prefix search over names and categories (diacritic-insensitive, non-blocking). */\r\n query(text: string): Promise<SearchResult[]>;\r\n /** All visible locations in a category, sorted. */\r\n byCategory(categoryId: string): VenueLocation[];\r\n}\r\nexport function createSearchFacade(deps: {\r\n query: (text: string) => Promise<SearchResult[]>;\r\n byCategory: (categoryId: string) => VenueLocation[];\r\n}): SearchFacade {\r\n return { query: deps.query, byCategory: deps.byCategory };\r\n}\r\n\r\nimport type { NavStepInfo } from '../routing/navigation.js';\r\n\r\nexport interface RouteInfo {\r\n /** Total walking distance in meters. */\r\n distanceMeters: number;\r\n /** Number of turn-by-turn steps. */\r\n stepCount: number;\r\n}\r\n\r\n/** Routing and navigation (live since Phase 6). */\r\nexport interface RoutingFacade {\r\n /** Compute + render + preview a route between two locations. */\r\n route(\r\n fromLocationId: string,\r\n toLocationId: string,\r\n options?: { accessibleOnly?: boolean },\r\n ): Promise<RouteInfo>;\r\n /** Clear the active route (the ONLY way besides the route bar ✕). */\r\n clear(): void;\r\n /** Replay the runner preview along the active route. */\r\n preview(): void;\r\n /** Step navigation (mirrors the built-in route bar). */\r\n next(): void;\r\n previous(): void;\r\n stepInfo(): NavStepInfo | null;\r\n active(): boolean;\r\n}\r\nexport function createRoutingFacade(deps: {\r\n route: (from: string, to: string, options?: { accessibleOnly?: boolean }) => Promise<RouteInfo>;\r\n clear: () => void;\r\n preview: () => void;\r\n next: () => void;\r\n previous: () => void;\r\n stepInfo: () => NavStepInfo | null;\r\n active: () => boolean;\r\n}): RoutingFacade {\r\n return { ...deps };\r\n}\r\n\r\n/** Camera control helpers (live since Phase 5). */\r\nexport interface CameraFacade {\r\n /** Fit the camera to the loaded venue's extents. */\r\n focusVenue(options?: { pitch?: number; duration?: number }): void;\r\n /** Fly to a location, opening its building/floor if needed. */\r\n focusTo(locationId: string): void;\r\n}\r\nexport function createCameraFacade(deps: {\r\n focusVenue: (options?: { pitch?: number; duration?: number }) => void;\r\n focusTo: (locationId: string) => void;\r\n}): CameraFacade {\r\n return {\r\n focusVenue: deps.focusVenue,\r\n focusTo: deps.focusTo,\r\n };\r\n}\r\n","import type { VenueProvider } from './provider.js';\r\nimport type {\r\n LngLat,\r\n PolygonGeometry,\r\n RawBuilding,\r\n RawFloorConnection,\r\n RawLocation,\r\n RawNode,\r\n RawShape,\r\n VenueData,\r\n} from './types.js';\r\n\r\n/**\r\n * Procedural venue generator, ported from the validated POC\r\n * (`becomap-poc/src/venue.js`): 3 irregular buildings (curved stadium,\r\n * L-shape, rounded corner), multiple floors, organic store rows with varied\r\n * frontages/gaps, corridor + spine walk graph, elevators, doors, and an\r\n * outdoor plaza hub. Deterministic (seeded PRNG) so tests are stable.\r\n */\r\n\r\nconst CENTER: LngLat = [55.2708, 25.2048];\r\nconst M_PER_DEG_LAT = 111320;\r\n\r\nfunction metersToLngLat(dxEast: number, dyNorth: number): LngLat {\r\n return [\r\n CENTER[0] + dxEast / (M_PER_DEG_LAT * Math.cos((CENTER[1] * Math.PI) / 180)),\r\n CENTER[1] + dyNorth / M_PER_DEG_LAT,\r\n ];\r\n}\r\n\r\nfunction makeRng(seed: number): () => number {\r\n let s = seed >>> 0;\r\n return () => {\r\n s = (s * 1664525 + 1013904223) >>> 0;\r\n return s / 4294967296;\r\n };\r\n}\r\n\r\nfunction pointInPolygon(poly: [number, number][], x: number, y: number): boolean {\r\n let inside = false;\r\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\r\n const pi = poly[i];\r\n const pj = poly[j];\r\n if (!pi || !pj) continue;\r\n const [xi, yi] = pi;\r\n const [xj, yj] = pj;\r\n if (yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi) inside = !inside;\r\n }\r\n return inside;\r\n}\r\n\r\ninterface BuildingSpec {\r\n id: string;\r\n name: string;\r\n cx: number;\r\n cy: number;\r\n w: number;\r\n d: number;\r\n floors: number;\r\n}\r\n\r\nconst BUILDINGS: BuildingSpec[] = [\r\n { id: 'bldg-a', name: 'North Mall', cx: -175, cy: 95, w: 150, d: 120, floors: 3 },\r\n { id: 'bldg-b', name: 'East Wing', cx: 175, cy: 70, w: 140, d: 140, floors: 4 },\r\n { id: 'bldg-c', name: 'South Plaza', cx: -15, cy: -175, w: 165, d: 120, floors: 2 },\r\n];\r\n\r\nconst FLOOR_NAMES = ['G', '1', '2', '3'];\r\nconst PLAZA: [number, number] = [-5, -15];\r\n\r\n// mall interior layout (meters) — matches POC\r\nconst ROW_H = 10;\r\nconst CORR = 7;\r\nconst VCORR_HALF = 4;\r\nconst MARGIN = 5;\r\nconst STORE_W_MIN = 9;\r\nconst STORE_W_VAR = 7;\r\n\r\nconst CATEGORY_SPECS = [\r\n { id: 'cat-fashion', name: 'Fashion', colorHex: '#93b7d4' },\r\n { id: 'cat-food', name: 'Food & Drink', colorHex: '#f2a65e' },\r\n { id: 'cat-services', name: 'Services', colorHex: '#f7d488' },\r\n { id: 'cat-beauty', name: 'Beauty', colorHex: '#e8968a' },\r\n { id: 'cat-electronics', name: 'Electronics', colorHex: '#9ccfc3' },\r\n];\r\n\r\n/** Irregular footprint outlines in local meters (ported from POC). */\r\nfunction footprintOutline(spec: BuildingSpec): [number, number][] {\r\n const hw = spec.w / 2;\r\n const hd = spec.d / 2;\r\n const pts: [number, number][] = [];\r\n if (spec.id.startsWith('bldg-a')) {\r\n const flat = hw - hd;\r\n pts.push([-flat, -hd], [hw, -hd], [hw, hd], [-flat, hd]);\r\n for (let i = 1; i < 16; i++) {\r\n const t = Math.PI / 2 + (i / 16) * Math.PI;\r\n pts.push([-flat + Math.cos(t) * hd, Math.sin(t) * hd]);\r\n }\r\n } else if (spec.id.startsWith('bldg-b')) {\r\n const nx = 10;\r\n pts.push([-hw, -hd], [hw, -hd], [hw, nx], [nx, nx], [nx, hd], [-hw, hd]);\r\n } else {\r\n pts.push([-hw, -hd], [hw, -hd], [hw, hd - 40]);\r\n for (let i = 1; i <= 8; i++) {\r\n const t = (i / 8) * (Math.PI / 2);\r\n pts.push([hw - 45 + Math.cos(t) * 45 * (1 - i / 16), hd - 40 + Math.sin(t) * 40]);\r\n }\r\n pts.push([hw - 45, hd], [-hw + 22, hd], [-hw, hd - 25]);\r\n }\r\n return pts;\r\n}\r\n\r\nfunction polygonGeometry(outlineMeters: [number, number][]): PolygonGeometry {\r\n const ring = outlineMeters.map(([x, y]) => metersToLngLat(x, y));\r\n const first = ring[0];\r\n if (first) ring.push([first[0], first[1]]);\r\n return { type: 'Polygon', coordinates: [ring] };\r\n}\r\n\r\nfunction rectOutline(cx: number, cy: number, w: number, d: number): [number, number][] {\r\n return [\r\n [cx - w / 2, cy - d / 2],\r\n [cx + w / 2, cy - d / 2],\r\n [cx + w / 2, cy + d / 2],\r\n [cx - w / 2, cy + d / 2],\r\n ];\r\n}\r\n\r\nexport class MockVenueProvider implements VenueProvider {\r\n #seed: number;\r\n #stress: number;\r\n\r\n /**\r\n * @param options.stress Tile the campus stress×stress (default 1). Used to\r\n * exceed venue-scale polygon counts for performance verification.\r\n */\r\n constructor(options: { seed?: number; stress?: number } = {}) {\r\n this.#seed = options.seed ?? 1337;\r\n this.#stress = Math.max(1, Math.floor(options.stress ?? 1));\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/require-await\r\n async fetchVenue(): Promise<VenueData> {\r\n const buildings: RawBuilding[] = [];\r\n const nodes: RawNode[] = [];\r\n const shapes: RawShape[] = [];\r\n const locations: RawLocation[] = [];\r\n const floorConnections: RawFloorConnection[] = [];\r\n\r\n const link = (a: RawNode, b: RawNode): void => {\r\n if (!a.siblings.includes(b.id)) a.siblings.push(b.id);\r\n if (!b.siblings.includes(a.id)) b.siblings.push(a.id);\r\n };\r\n\r\n // outdoor pseudo-floor: plaza hub + per-building door aprons\r\n const outdoorFloorId = 'outdoor';\r\n\r\n // stress mode tiles the whole campus in a grid\r\n const specs: (BuildingSpec & { plazaId: string; plazaY: number })[] = [];\r\n const plazaByTile = new Map<string, RawNode>();\r\n for (let ti = 0; ti < this.#stress; ti++) {\r\n for (let tj = 0; tj < this.#stress; tj++) {\r\n const ox = ti * 900;\r\n const oy = tj * 900;\r\n const tileSuffix = this.#stress > 1 ? `-t${String(ti)}${String(tj)}` : '';\r\n const plazaId = `node-plaza${tileSuffix}`;\r\n const plazaNode: RawNode = {\r\n id: plazaId,\r\n lng: metersToLngLat(PLAZA[0] + ox, PLAZA[1] + oy)[0],\r\n lat: metersToLngLat(PLAZA[0] + ox, PLAZA[1] + oy)[1],\r\n floorId: outdoorFloorId,\r\n accessible: true,\r\n privateNode: false,\r\n siblings: [],\r\n };\r\n nodes.push(plazaNode);\r\n plazaByTile.set(plazaId, plazaNode);\r\n for (const b of BUILDINGS) {\r\n specs.push({\r\n ...b,\r\n id: `${b.id}${tileSuffix}`,\r\n name: this.#stress > 1 ? `${b.name} ${String(ti)}${String(tj)}` : b.name,\r\n cx: b.cx + ox,\r\n cy: b.cy + oy,\r\n plazaId,\r\n plazaY: PLAZA[1] + oy,\r\n });\r\n }\r\n }\r\n }\r\n\r\n for (const spec of specs) {\r\n const plazaNode = plazaByTile.get(spec.plazaId);\r\n if (!plazaNode) continue;\r\n let idHash = 0;\r\n for (let i = 0; i < spec.id.length; i++) idHash = (idHash * 31 + spec.id.charCodeAt(i)) >>> 0;\r\n const rngBase = this.#seed + (idHash % 100000);\r\n const outline = footprintOutline(spec);\r\n const outlineAbs = outline.map(([x, y]): [number, number] => [x + spec.cx, y + spec.cy]);\r\n const doorSide = spec.plazaY - spec.cy > 0 ? 1 : -1;\r\n\r\n const building: RawBuilding = { id: spec.id, name: spec.name, floors: [] };\r\n const elevatorNodeIds: string[] = [];\r\n\r\n for (let f = 0; f < spec.floors; f++) {\r\n const rng = makeRng(rngBase + f * 7919);\r\n const floorId = `${spec.id}-f${String(f)}`;\r\n building.floors.push({\r\n id: floorId,\r\n name: FLOOR_NAMES[f] ?? String(f),\r\n level: f,\r\n buildingId: spec.id,\r\n });\r\n\r\n // building footprint shape (rendered as slab/shell in Phase 3+)\r\n shapes.push({\r\n id: `${floorId}-footprint`,\r\n floorId,\r\n layerId: 'footprint',\r\n type: 'polygon',\r\n geometry: polygonGeometry(outlineAbs),\r\n });\r\n\r\n // elevator node at the building center, on the spine\r\n const elevNode: RawNode = {\r\n id: `${floorId}-elev`,\r\n lng: metersToLngLat(spec.cx, spec.cy)[0],\r\n lat: metersToLngLat(spec.cx, spec.cy)[1],\r\n floorId,\r\n accessible: true,\r\n privateNode: false,\r\n siblings: [],\r\n };\r\n nodes.push(elevNode);\r\n elevatorNodeIds.push(elevNode.id);\r\n\r\n // organic store rows with corridor/spine graph\r\n const rowPitch = ROW_H + CORR;\r\n const yStart = spec.cy - spec.d / 2 + MARGIN + CORR + ROW_H / 2;\r\n const yEnd = spec.cy + spec.d / 2 - MARGIN - ROW_H / 2;\r\n const spineJunctions: RawNode[] = [];\r\n let storeIdx = 0;\r\n\r\n for (let ry = yStart; ry <= yEnd + 0.01; ry += rowPitch) {\r\n const corrY = ry - ROW_H / 2 - CORR / 2;\r\n const junction: RawNode = {\r\n id: `${floorId}-jn-${String(spineJunctions.length)}`,\r\n lng: metersToLngLat(spec.cx, corrY)[0],\r\n lat: metersToLngLat(spec.cx, corrY)[1],\r\n floorId,\r\n accessible: true,\r\n privateNode: false,\r\n siblings: [],\r\n };\r\n nodes.push(junction);\r\n spineJunctions.push(junction);\r\n\r\n const halves: [number, number][] = [\r\n [spec.cx - spec.w / 2 + MARGIN, spec.cx - VCORR_HALF],\r\n [spec.cx + VCORR_HALF, spec.cx + spec.w / 2 - MARGIN],\r\n ];\r\n for (const [hx0, hx1] of halves) {\r\n let cursor = hx0 + rng() * 3;\r\n let prevNode: RawNode = junction;\r\n const frontY = ry - ROW_H / 2;\r\n while (cursor < hx1 - STORE_W_MIN) {\r\n const sw = STORE_W_MIN + rng() * STORE_W_VAR;\r\n if (cursor + sw > hx1) break;\r\n const gap = 1.5 + rng() * 2.5;\r\n if (rng() < 0.08) {\r\n cursor += sw * 0.6;\r\n continue;\r\n }\r\n const depth = ROW_H * (0.85 + rng() * 0.35);\r\n const sx = cursor + sw / 2;\r\n const scy = frontY + depth / 2;\r\n const corners: [number, number][] = [\r\n [sx - sw / 2 - MARGIN, frontY - 1],\r\n [sx + sw / 2 + MARGIN, frontY - 1],\r\n [sx + sw / 2 + MARGIN, frontY + depth + MARGIN],\r\n [sx - sw / 2 - MARGIN, frontY + depth + MARGIN],\r\n ];\r\n if (!corners.every(([px, py]) => pointInPolygon(outlineAbs, px, py))) {\r\n cursor += sw + gap;\r\n continue;\r\n }\r\n storeIdx++;\r\n const storeId = `${floorId}-s${String(storeIdx).padStart(2, '0')}`;\r\n // store polygon\r\n shapes.push({\r\n id: `${storeId}-shape`,\r\n floorId,\r\n layerId: 'unit',\r\n type: 'polygon',\r\n geometry: polygonGeometry(rectOutline(sx, scy, sw, depth)),\r\n });\r\n // store front node on the corridor, chained along the row\r\n const frontNode: RawNode = {\r\n id: `${storeId}-node`,\r\n lng: metersToLngLat(sx, corrY)[0],\r\n lat: metersToLngLat(sx, corrY)[1],\r\n floorId,\r\n accessible: true,\r\n privateNode: false,\r\n siblings: [],\r\n };\r\n nodes.push(frontNode);\r\n link(prevNode, frontNode);\r\n prevNode = frontNode;\r\n // location\r\n const cat = CATEGORY_SPECS[Math.floor(rng() * CATEGORY_SPECS.length)];\r\n locations.push({\r\n id: `${storeId}-loc`,\r\n name: `${spec.name.split(' ')[0] ?? spec.id} ${FLOOR_NAMES[f] ?? String(f)}-${String(storeIdx).padStart(2, '0')}`,\r\n type: 'tenant',\r\n nodeId: frontNode.id,\r\n shapeId: `${storeId}-shape`,\r\n categoryIds: cat ? [cat.id] : [],\r\n hidden: false,\r\n sortOrder: storeIdx,\r\n });\r\n cursor += sw + gap;\r\n }\r\n }\r\n }\r\n\r\n // chain spine junctions vertically and hook in the elevator\r\n for (let i = 1; i < spineJunctions.length; i++) {\r\n const a = spineJunctions[i - 1];\r\n const b = spineJunctions[i];\r\n if (a && b) link(a, b);\r\n }\r\n // elevator connects to the nearest junction (by index around cy)\r\n let nearest: RawNode | undefined;\r\n let nearestDist = Infinity;\r\n for (const jn of spineJunctions) {\r\n const d = Math.abs(jn.lat - elevNode.lat);\r\n if (d < nearestDist) {\r\n nearestDist = d;\r\n nearest = jn;\r\n }\r\n }\r\n if (nearest) link(elevNode, nearest);\r\n\r\n // ground floor: door node on the plaza-facing wall + outdoor apron\r\n if (f === 0) {\r\n const doorY = spec.cy + doorSide * (spec.d / 2);\r\n const doorNode: RawNode = {\r\n id: `${spec.id}-door`,\r\n lng: metersToLngLat(spec.cx, doorY)[0],\r\n lat: metersToLngLat(spec.cx, doorY)[1],\r\n floorId,\r\n accessible: true,\r\n privateNode: false,\r\n siblings: [],\r\n };\r\n const apronNode: RawNode = {\r\n id: `${spec.id}-apron`,\r\n lng: metersToLngLat(spec.cx, doorY + doorSide * 10)[0],\r\n lat: metersToLngLat(spec.cx, doorY + doorSide * 10)[1],\r\n floorId: outdoorFloorId,\r\n accessible: true,\r\n privateNode: false,\r\n siblings: [],\r\n };\r\n nodes.push(doorNode, apronNode);\r\n // door chains to the spine end nearest the door\r\n const endJunction = doorSide === -1 ? spineJunctions[0] : spineJunctions[spineJunctions.length - 1];\r\n if (endJunction) link(doorNode, endJunction);\r\n link(doorNode, apronNode);\r\n link(apronNode, plazaNode);\r\n locations.push({\r\n id: `${spec.id}-entrance`,\r\n name: `${spec.name} Entrance`,\r\n type: 'entrance',\r\n nodeId: doorNode.id,\r\n categoryIds: [],\r\n hidden: false,\r\n sortOrder: 0,\r\n });\r\n }\r\n }\r\n\r\n // one elevator connection per adjacent floor pair (editor semantics:\r\n // a connection joins exactly two nodes, weight 0 → default cost 100)\r\n for (let i = 1; i < elevatorNodeIds.length; i++) {\r\n const startNodeId = elevatorNodeIds[i - 1];\r\n const endNodeId = elevatorNodeIds[i];\r\n if (!startNodeId || !endNodeId) continue;\r\n floorConnections.push({\r\n id: `${spec.id}-elevator-${String(i)}`,\r\n kind: 'elevator',\r\n name: `${spec.name} Elevator`,\r\n accessible: true,\r\n weight: 0,\r\n multiplier: 1,\r\n direction: 'both',\r\n startNodeId,\r\n endNodeId,\r\n });\r\n }\r\n buildings.push(building);\r\n }\r\n\r\n return {\r\n site: { id: 'mock-site', name: 'Mock Campus', center: CENTER },\r\n buildings,\r\n nodes,\r\n shapes,\r\n locations,\r\n categories: CATEGORY_SPECS.map((c, i) => ({\r\n id: c.id,\r\n name: c.name,\r\n sortOrder: i,\r\n colorHex: c.colorHex,\r\n })),\r\n mapObjects: [],\r\n floorConnections,\r\n };\r\n }\r\n}\r\n","/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-mixed-operators, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars, default-case, jsdoc/require-param*/\nimport $protobuf from \"protobufjs/minimal.js\";\n\n// Common aliases\nconst $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\nconst $Object = $util.global.Object, $undefined = $util.global.undefined, $Error = $util.global.Error;\n\n// Exported root namespace\nconst $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\n\nexport const com = $root.com = (() => {\n\n /**\n * Namespace com.\n * @exports com\n * @namespace\n */\n const com = {};\n\n com.beco = (function() {\n\n /**\n * Namespace beco.\n * @memberof com\n * @namespace\n */\n const beco = {};\n\n beco.category = (function() {\n\n /**\n * Namespace category.\n * @memberof com.beco\n * @namespace\n */\n const category = {};\n\n category.Category = (function() {\n\n /**\n * Properties of a Category.\n * @typedef {Object} com.beco.category.Category.$Properties\n * @property {string|null} [categoryId] Category categoryId\n * @property {string|null} [name] Category name\n * @property {string|null} [iconFromDefaultList] Category iconFromDefaultList\n * @property {number|null} [sortOrder] Category sortOrder\n * @property {com.beco.category.Color.$Properties|null} [color] Category color\n * @property {string|null} [externalId] Category externalId\n * @property {string|null} [siteId] Category siteId\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a Category.\n * @memberof com.beco.category\n * @interface ICategory\n * @augments com.beco.category.Category.$Properties\n * @deprecated Use com.beco.category.Category.$Properties instead.\n */\n\n /**\n * Shape of a Category.\n * @typedef {com.beco.category.Category.$Properties} com.beco.category.Category.$Shape\n */\n\n /**\n * Constructs a new Category.\n * @memberof com.beco.category\n * @classdesc Represents a Category.\n * @constructor\n * @param {com.beco.category.Category.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const Category = function (properties) {\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * Category categoryId.\n * @member {string} categoryId\n * @memberof com.beco.category.Category\n * @instance\n */\n Category.prototype.categoryId = \"\";\n\n /**\n * Category name.\n * @member {string} name\n * @memberof com.beco.category.Category\n * @instance\n */\n Category.prototype.name = \"\";\n\n /**\n * Category iconFromDefaultList.\n * @member {string} iconFromDefaultList\n * @memberof com.beco.category.Category\n * @instance\n */\n Category.prototype.iconFromDefaultList = \"\";\n\n /**\n * Category sortOrder.\n * @member {number} sortOrder\n * @memberof com.beco.category.Category\n * @instance\n */\n Category.prototype.sortOrder = 0;\n\n /**\n * Category color.\n * @member {com.beco.category.Color.$Properties|null|undefined} color\n * @memberof com.beco.category.Category\n * @instance\n */\n Category.prototype.color = null;\n\n /**\n * Category externalId.\n * @member {string} externalId\n * @memberof com.beco.category.Category\n * @instance\n */\n Category.prototype.externalId = \"\";\n\n /**\n * Category siteId.\n * @member {string} siteId\n * @memberof com.beco.category.Category\n * @instance\n */\n Category.prototype.siteId = \"\";\n\n /**\n * Creates a new Category instance using the specified properties.\n * @function create\n * @memberof com.beco.category.Category\n * @static\n * @param {com.beco.category.Category.$Properties=} [properties] Properties to set\n * @returns {com.beco.category.Category} Category instance\n * @type {{\n * (properties: com.beco.category.Category.$Shape): com.beco.category.Category & com.beco.category.Category.$Shape;\n * (properties?: com.beco.category.Category.$Properties): com.beco.category.Category;\n * }}\n */\n Category.create = function(properties) {\n return new Category(properties);\n };\n\n /**\n * Encodes the specified Category message. Does not implicitly {@link com.beco.category.Category.verify|verify} messages.\n * @function encode\n * @memberof com.beco.category.Category\n * @static\n * @param {com.beco.category.Category.$Properties} message Category message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Category.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.categoryId != null && $Object.hasOwnProperty.call(message, \"categoryId\") && message.categoryId !== \"\")\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.categoryId);\n if (message.name != null && $Object.hasOwnProperty.call(message, \"name\") && message.name !== \"\")\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.name);\n if (message.iconFromDefaultList != null && $Object.hasOwnProperty.call(message, \"iconFromDefaultList\") && message.iconFromDefaultList !== \"\")\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.iconFromDefaultList);\n if (message.sortOrder != null && $Object.hasOwnProperty.call(message, \"sortOrder\") && message.sortOrder !== 0)\n writer.uint32(/* id 4, wireType 0 =*/32).int32(message.sortOrder);\n if (message.color != null && $Object.hasOwnProperty.call(message, \"color\"))\n $root.com.beco.category.Color.encode(message.color, writer.uint32(/* id 5, wireType 2 =*/42).fork(), _depth + 1).ldelim();\n if (message.externalId != null && $Object.hasOwnProperty.call(message, \"externalId\") && message.externalId !== \"\")\n writer.uint32(/* id 6, wireType 2 =*/50).string(message.externalId);\n if (message.siteId != null && $Object.hasOwnProperty.call(message, \"siteId\") && message.siteId !== \"\")\n writer.uint32(/* id 7, wireType 2 =*/58).string(message.siteId);\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a Category message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.category.Category\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.category.Category & com.beco.category.Category.$Shape} Category\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Category.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.category.Category(), value;\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.categoryId = value;\n else\n delete message.categoryId;\n continue;\n }\n case 2: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.name = value;\n else\n delete message.name;\n continue;\n }\n case 3: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.iconFromDefaultList = value;\n else\n delete message.iconFromDefaultList;\n continue;\n }\n case 4: {\n if (wireType !== 0)\n break;\n if (value = reader.int32())\n message.sortOrder = value;\n else\n delete message.sortOrder;\n continue;\n }\n case 5: {\n if (wireType !== 2)\n break;\n message.color = $root.com.beco.category.Color.decode(reader, reader.uint32(), $undefined, _depth + 1, message.color);\n continue;\n }\n case 6: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.externalId = value;\n else\n delete message.externalId;\n continue;\n }\n case 7: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.siteId = value;\n else\n delete message.siteId;\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for Category\n * @function getTypeUrl\n * @memberof com.beco.category.Category\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n Category.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.category.Category\";\n };\n\n return Category;\n })();\n\n category.Color = (function() {\n\n /**\n * Properties of a Color.\n * @typedef {Object} com.beco.category.Color.$Properties\n * @property {string|null} [rgba] Color rgba\n * @property {string|null} [hex] Color hex\n * @property {number|null} [opacity] Color opacity\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a Color.\n * @memberof com.beco.category\n * @interface IColor\n * @augments com.beco.category.Color.$Properties\n * @deprecated Use com.beco.category.Color.$Properties instead.\n */\n\n /**\n * Shape of a Color.\n * @typedef {com.beco.category.Color.$Properties} com.beco.category.Color.$Shape\n */\n\n /**\n * Constructs a new Color.\n * @memberof com.beco.category\n * @classdesc Represents a Color.\n * @constructor\n * @param {com.beco.category.Color.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const Color = function (properties) {\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * Color rgba.\n * @member {string} rgba\n * @memberof com.beco.category.Color\n * @instance\n */\n Color.prototype.rgba = \"\";\n\n /**\n * Color hex.\n * @member {string} hex\n * @memberof com.beco.category.Color\n * @instance\n */\n Color.prototype.hex = \"\";\n\n /**\n * Color opacity.\n * @member {number} opacity\n * @memberof com.beco.category.Color\n * @instance\n */\n Color.prototype.opacity = 0;\n\n /**\n * Creates a new Color instance using the specified properties.\n * @function create\n * @memberof com.beco.category.Color\n * @static\n * @param {com.beco.category.Color.$Properties=} [properties] Properties to set\n * @returns {com.beco.category.Color} Color instance\n * @type {{\n * (properties: com.beco.category.Color.$Shape): com.beco.category.Color & com.beco.category.Color.$Shape;\n * (properties?: com.beco.category.Color.$Properties): com.beco.category.Color;\n * }}\n */\n Color.create = function(properties) {\n return new Color(properties);\n };\n\n /**\n * Encodes the specified Color message. Does not implicitly {@link com.beco.category.Color.verify|verify} messages.\n * @function encode\n * @memberof com.beco.category.Color\n * @static\n * @param {com.beco.category.Color.$Properties} message Color message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Color.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.rgba != null && $Object.hasOwnProperty.call(message, \"rgba\") && message.rgba !== \"\")\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.rgba);\n if (message.hex != null && $Object.hasOwnProperty.call(message, \"hex\") && message.hex !== \"\")\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.hex);\n if (message.opacity != null && $Object.hasOwnProperty.call(message, \"opacity\") && !$Object.is(message.opacity, 0))\n writer.uint32(/* id 3, wireType 1 =*/25).double(message.opacity);\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a Color message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.category.Color\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.category.Color & com.beco.category.Color.$Shape} Color\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Color.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.category.Color(), value;\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.rgba = value;\n else\n delete message.rgba;\n continue;\n }\n case 2: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.hex = value;\n else\n delete message.hex;\n continue;\n }\n case 3: {\n if (wireType !== 1)\n break;\n if (!$Object.is(value = reader.double(), 0))\n message.opacity = value;\n else\n delete message.opacity;\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for Color\n * @function getTypeUrl\n * @memberof com.beco.category.Color\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n Color.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.category.Color\";\n };\n\n return Color;\n })();\n\n category.CategoryList = (function() {\n\n /**\n * Properties of a CategoryList.\n * @typedef {Object} com.beco.category.CategoryList.$Properties\n * @property {Array.<com.beco.category.Category.$Properties>|null} [categories] CategoryList categories\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a CategoryList.\n * @memberof com.beco.category\n * @interface ICategoryList\n * @augments com.beco.category.CategoryList.$Properties\n * @deprecated Use com.beco.category.CategoryList.$Properties instead.\n */\n\n /**\n * Shape of a CategoryList.\n * @typedef {com.beco.category.CategoryList.$Properties} com.beco.category.CategoryList.$Shape\n */\n\n /**\n * Constructs a new CategoryList.\n * @memberof com.beco.category\n * @classdesc Represents a CategoryList.\n * @constructor\n * @param {com.beco.category.CategoryList.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const CategoryList = function (properties) {\n this.categories = [];\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * CategoryList categories.\n * @member {Array.<com.beco.category.Category.$Properties>} categories\n * @memberof com.beco.category.CategoryList\n * @instance\n */\n CategoryList.prototype.categories = $util.emptyArray;\n\n /**\n * Creates a new CategoryList instance using the specified properties.\n * @function create\n * @memberof com.beco.category.CategoryList\n * @static\n * @param {com.beco.category.CategoryList.$Properties=} [properties] Properties to set\n * @returns {com.beco.category.CategoryList} CategoryList instance\n * @type {{\n * (properties: com.beco.category.CategoryList.$Shape): com.beco.category.CategoryList & com.beco.category.CategoryList.$Shape;\n * (properties?: com.beco.category.CategoryList.$Properties): com.beco.category.CategoryList;\n * }}\n */\n CategoryList.create = function(properties) {\n return new CategoryList(properties);\n };\n\n /**\n * Encodes the specified CategoryList message. Does not implicitly {@link com.beco.category.CategoryList.verify|verify} messages.\n * @function encode\n * @memberof com.beco.category.CategoryList\n * @static\n * @param {com.beco.category.CategoryList.$Properties} message CategoryList message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n CategoryList.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.categories != null && message.categories.length)\n for (let i = 0; i < message.categories.length; ++i)\n $root.com.beco.category.Category.encode(message.categories[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), _depth + 1).ldelim();\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a CategoryList message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.category.CategoryList\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.category.CategoryList & com.beco.category.CategoryList.$Shape} CategoryList\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n CategoryList.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.category.CategoryList();\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if (!(message.categories && message.categories.length))\n message.categories = [];\n message.categories.push($root.com.beco.category.Category.decode(reader, reader.uint32(), $undefined, _depth + 1));\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for CategoryList\n * @function getTypeUrl\n * @memberof com.beco.category.CategoryList\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n CategoryList.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.category.CategoryList\";\n };\n\n return CategoryList;\n })();\n\n return category;\n })();\n\n beco.location = (function() {\n\n /**\n * Namespace location.\n * @memberof com.beco\n * @namespace\n */\n const location = {};\n\n location.Location = (function() {\n\n /**\n * Properties of a Location.\n * @typedef {Object} com.beco.location.Location.$Properties\n * @property {string|null} [locationId] Location locationId\n * @property {string|null} [externalId] Location externalId\n * @property {string|null} [name] Location name\n * @property {string|null} [type] Location type\n * @property {string|null} [description] Location description\n * @property {string|null} [nodeId] Location nodeId\n * @property {string|null} [polygonId] Location polygonId\n * @property {boolean|null} [hidden] Location hidden\n * @property {number|null} [sortOrder] Location sortOrder\n * @property {string|null} [amenity] Location amenity\n * @property {Object.<string,string>|null} [phone] Location phone\n * @property {Object.<string,string>|null} [social] Location social\n * @property {Array.<com.beco.location.OperationHour.$Properties>|null} [operationHours] Location operationHours\n * @property {Array.<com.beco.location.Link.$Properties>|null} [links] Location links\n * @property {Array.<com.beco.location.SiblingGroup.$Properties>|null} [siblingGroups] Location siblingGroups\n * @property {boolean|null} [showSmartLabelWhenImagePresent] Location showSmartLabelWhenImagePresent\n * @property {Array.<string>|null} [categories] Location categories\n * @property {string|null} [stateName] Location stateName\n * @property {Array.<string>|null} [tags] Location tags\n * @property {string|null} [address] Location address\n * @property {string|null} [banner] Location banner\n * @property {string|null} [logo] Location logo\n * @property {com.beco.location.Zone.$Properties|null} [zone] Location zone\n * @property {boolean|null} [topLocation] Location topLocation\n * @property {boolean|null} [showLogo] Location showLogo\n * @property {number|null} [minZoom] Location minZoom\n * @property {com.beco.location.MapObject.$Properties|null} [mapObject] Location mapObject\n * @property {string|null} [area] Location area\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a Location.\n * @memberof com.beco.location\n * @interface ILocation\n * @augments com.beco.location.Location.$Properties\n * @deprecated Use com.beco.location.Location.$Properties instead.\n */\n\n /**\n * Shape of a Location.\n * @typedef {com.beco.location.Location.$Properties} com.beco.location.Location.$Shape\n */\n\n /**\n * Constructs a new Location.\n * @memberof com.beco.location\n * @classdesc Represents a Location.\n * @constructor\n * @param {com.beco.location.Location.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const Location = function (properties) {\n this.phone = {};\n this.social = {};\n this.operationHours = [];\n this.links = [];\n this.siblingGroups = [];\n this.categories = [];\n this.tags = [];\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * Location locationId.\n * @member {string} locationId\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.locationId = \"\";\n\n /**\n * Location externalId.\n * @member {string} externalId\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.externalId = \"\";\n\n /**\n * Location name.\n * @member {string} name\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.name = \"\";\n\n /**\n * Location type.\n * @member {string} type\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.type = \"\";\n\n /**\n * Location description.\n * @member {string} description\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.description = \"\";\n\n /**\n * Location nodeId.\n * @member {string} nodeId\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.nodeId = \"\";\n\n /**\n * Location polygonId.\n * @member {string} polygonId\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.polygonId = \"\";\n\n /**\n * Location hidden.\n * @member {boolean} hidden\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.hidden = false;\n\n /**\n * Location sortOrder.\n * @member {number} sortOrder\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.sortOrder = 0;\n\n /**\n * Location amenity.\n * @member {string} amenity\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.amenity = \"\";\n\n /**\n * Location phone.\n * @member {Object.<string,string>} phone\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.phone = $util.emptyObject;\n\n /**\n * Location social.\n * @member {Object.<string,string>} social\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.social = $util.emptyObject;\n\n /**\n * Location operationHours.\n * @member {Array.<com.beco.location.OperationHour.$Properties>} operationHours\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.operationHours = $util.emptyArray;\n\n /**\n * Location links.\n * @member {Array.<com.beco.location.Link.$Properties>} links\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.links = $util.emptyArray;\n\n /**\n * Location siblingGroups.\n * @member {Array.<com.beco.location.SiblingGroup.$Properties>} siblingGroups\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.siblingGroups = $util.emptyArray;\n\n /**\n * Location showSmartLabelWhenImagePresent.\n * @member {boolean} showSmartLabelWhenImagePresent\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.showSmartLabelWhenImagePresent = false;\n\n /**\n * Location categories.\n * @member {Array.<string>} categories\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.categories = $util.emptyArray;\n\n /**\n * Location stateName.\n * @member {string} stateName\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.stateName = \"\";\n\n /**\n * Location tags.\n * @member {Array.<string>} tags\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.tags = $util.emptyArray;\n\n /**\n * Location address.\n * @member {string} address\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.address = \"\";\n\n /**\n * Location banner.\n * @member {string} banner\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.banner = \"\";\n\n /**\n * Location logo.\n * @member {string} logo\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.logo = \"\";\n\n /**\n * Location zone.\n * @member {com.beco.location.Zone.$Properties|null|undefined} zone\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.zone = null;\n\n /**\n * Location topLocation.\n * @member {boolean} topLocation\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.topLocation = false;\n\n /**\n * Location showLogo.\n * @member {boolean} showLogo\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.showLogo = false;\n\n /**\n * Location minZoom.\n * @member {number} minZoom\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.minZoom = 0;\n\n /**\n * Location mapObject.\n * @member {com.beco.location.MapObject.$Properties|null|undefined} mapObject\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.mapObject = null;\n\n /**\n * Location area.\n * @member {string} area\n * @memberof com.beco.location.Location\n * @instance\n */\n Location.prototype.area = \"\";\n\n /**\n * Creates a new Location instance using the specified properties.\n * @function create\n * @memberof com.beco.location.Location\n * @static\n * @param {com.beco.location.Location.$Properties=} [properties] Properties to set\n * @returns {com.beco.location.Location} Location instance\n * @type {{\n * (properties: com.beco.location.Location.$Shape): com.beco.location.Location & com.beco.location.Location.$Shape;\n * (properties?: com.beco.location.Location.$Properties): com.beco.location.Location;\n * }}\n */\n Location.create = function(properties) {\n return new Location(properties);\n };\n\n /**\n * Encodes the specified Location message. Does not implicitly {@link com.beco.location.Location.verify|verify} messages.\n * @function encode\n * @memberof com.beco.location.Location\n * @static\n * @param {com.beco.location.Location.$Properties} message Location message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Location.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.locationId != null && $Object.hasOwnProperty.call(message, \"locationId\") && message.locationId !== \"\")\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.locationId);\n if (message.externalId != null && $Object.hasOwnProperty.call(message, \"externalId\") && message.externalId !== \"\")\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.externalId);\n if (message.name != null && $Object.hasOwnProperty.call(message, \"name\") && message.name !== \"\")\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.name);\n if (message.type != null && $Object.hasOwnProperty.call(message, \"type\") && message.type !== \"\")\n writer.uint32(/* id 4, wireType 2 =*/34).string(message.type);\n if (message.description != null && $Object.hasOwnProperty.call(message, \"description\") && message.description !== \"\")\n writer.uint32(/* id 5, wireType 2 =*/42).string(message.description);\n if (message.nodeId != null && $Object.hasOwnProperty.call(message, \"nodeId\") && message.nodeId !== \"\")\n writer.uint32(/* id 6, wireType 2 =*/50).string(message.nodeId);\n if (message.polygonId != null && $Object.hasOwnProperty.call(message, \"polygonId\") && message.polygonId !== \"\")\n writer.uint32(/* id 7, wireType 2 =*/58).string(message.polygonId);\n if (message.hidden != null && $Object.hasOwnProperty.call(message, \"hidden\") && message.hidden !== false)\n writer.uint32(/* id 8, wireType 0 =*/64).bool(message.hidden);\n if (message.sortOrder != null && $Object.hasOwnProperty.call(message, \"sortOrder\") && message.sortOrder !== 0)\n writer.uint32(/* id 9, wireType 0 =*/72).int32(message.sortOrder);\n if (message.amenity != null && $Object.hasOwnProperty.call(message, \"amenity\") && message.amenity !== \"\")\n writer.uint32(/* id 10, wireType 2 =*/82).string(message.amenity);\n if (message.phone != null && $Object.hasOwnProperty.call(message, \"phone\"))\n for (let keys = $Object.keys(message.phone), i = 0; i < keys.length; ++i)\n writer.uint32(/* id 11, wireType 2 =*/90).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.phone[keys[i]]).ldelim();\n if (message.social != null && $Object.hasOwnProperty.call(message, \"social\"))\n for (let keys = $Object.keys(message.social), i = 0; i < keys.length; ++i)\n writer.uint32(/* id 12, wireType 2 =*/98).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]).uint32(/* id 2, wireType 2 =*/18).string(message.social[keys[i]]).ldelim();\n if (message.operationHours != null && message.operationHours.length)\n for (let i = 0; i < message.operationHours.length; ++i)\n $root.com.beco.location.OperationHour.encode(message.operationHours[i], writer.uint32(/* id 13, wireType 2 =*/106).fork(), _depth + 1).ldelim();\n if (message.links != null && message.links.length)\n for (let i = 0; i < message.links.length; ++i)\n $root.com.beco.location.Link.encode(message.links[i], writer.uint32(/* id 14, wireType 2 =*/114).fork(), _depth + 1).ldelim();\n if (message.siblingGroups != null && message.siblingGroups.length)\n for (let i = 0; i < message.siblingGroups.length; ++i)\n $root.com.beco.location.SiblingGroup.encode(message.siblingGroups[i], writer.uint32(/* id 15, wireType 2 =*/122).fork(), _depth + 1).ldelim();\n if (message.showSmartLabelWhenImagePresent != null && $Object.hasOwnProperty.call(message, \"showSmartLabelWhenImagePresent\") && message.showSmartLabelWhenImagePresent !== false)\n writer.uint32(/* id 16, wireType 0 =*/128).bool(message.showSmartLabelWhenImagePresent);\n if (message.categories != null && message.categories.length)\n for (let i = 0; i < message.categories.length; ++i)\n writer.uint32(/* id 17, wireType 2 =*/138).string(message.categories[i]);\n if (message.stateName != null && $Object.hasOwnProperty.call(message, \"stateName\") && message.stateName !== \"\")\n writer.uint32(/* id 18, wireType 2 =*/146).string(message.stateName);\n if (message.tags != null && message.tags.length)\n for (let i = 0; i < message.tags.length; ++i)\n writer.uint32(/* id 19, wireType 2 =*/154).string(message.tags[i]);\n if (message.address != null && $Object.hasOwnProperty.call(message, \"address\") && message.address !== \"\")\n writer.uint32(/* id 20, wireType 2 =*/162).string(message.address);\n if (message.banner != null && $Object.hasOwnProperty.call(message, \"banner\") && message.banner !== \"\")\n writer.uint32(/* id 21, wireType 2 =*/170).string(message.banner);\n if (message.logo != null && $Object.hasOwnProperty.call(message, \"logo\") && message.logo !== \"\")\n writer.uint32(/* id 22, wireType 2 =*/178).string(message.logo);\n if (message.zone != null && $Object.hasOwnProperty.call(message, \"zone\"))\n $root.com.beco.location.Zone.encode(message.zone, writer.uint32(/* id 23, wireType 2 =*/186).fork(), _depth + 1).ldelim();\n if (message.topLocation != null && $Object.hasOwnProperty.call(message, \"topLocation\") && message.topLocation !== false)\n writer.uint32(/* id 24, wireType 0 =*/192).bool(message.topLocation);\n if (message.showLogo != null && $Object.hasOwnProperty.call(message, \"showLogo\") && message.showLogo !== false)\n writer.uint32(/* id 25, wireType 0 =*/200).bool(message.showLogo);\n if (message.minZoom != null && $Object.hasOwnProperty.call(message, \"minZoom\") && message.minZoom !== 0)\n writer.uint32(/* id 26, wireType 0 =*/208).int32(message.minZoom);\n if (message.mapObject != null && $Object.hasOwnProperty.call(message, \"mapObject\"))\n $root.com.beco.location.MapObject.encode(message.mapObject, writer.uint32(/* id 27, wireType 2 =*/218).fork(), _depth + 1).ldelim();\n if (message.area != null && $Object.hasOwnProperty.call(message, \"area\") && message.area !== \"\")\n writer.uint32(/* id 28, wireType 2 =*/226).string(message.area);\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a Location message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.location.Location\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.location.Location & com.beco.location.Location.$Shape} Location\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Location.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.location.Location(), key, value;\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.locationId = value;\n else\n delete message.locationId;\n continue;\n }\n case 2: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.externalId = value;\n else\n delete message.externalId;\n continue;\n }\n case 3: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.name = value;\n else\n delete message.name;\n continue;\n }\n case 4: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.type = value;\n else\n delete message.type;\n continue;\n }\n case 5: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.description = value;\n else\n delete message.description;\n continue;\n }\n case 6: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.nodeId = value;\n else\n delete message.nodeId;\n continue;\n }\n case 7: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.polygonId = value;\n else\n delete message.polygonId;\n continue;\n }\n case 8: {\n if (wireType !== 0)\n break;\n if (value = reader.bool())\n message.hidden = value;\n else\n delete message.hidden;\n continue;\n }\n case 9: {\n if (wireType !== 0)\n break;\n if (value = reader.int32())\n message.sortOrder = value;\n else\n delete message.sortOrder;\n continue;\n }\n case 10: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.amenity = value;\n else\n delete message.amenity;\n continue;\n }\n case 11: {\n if (wireType !== 2)\n break;\n if (message.phone === $util.emptyObject)\n message.phone = {};\n let end2 = reader.uint32() + reader.pos;\n key = \"\";\n value = \"\";\n while (reader.pos < end2) {\n let tag2 = reader.tag();\n wireType = tag2 & 7;\n switch (tag2 >>>= 3) {\n case 1:\n if (wireType !== 2)\n break;\n key = reader.stringVerify();\n continue;\n case 2:\n if (wireType !== 2)\n break;\n value = reader.stringVerify();\n continue;\n }\n reader.skipType(wireType, _depth, tag2);\n }\n if (key === \"__proto__\")\n $util.makeProp(message.phone, key);\n message.phone[key] = value;\n continue;\n }\n case 12: {\n if (wireType !== 2)\n break;\n if (message.social === $util.emptyObject)\n message.social = {};\n let end2 = reader.uint32() + reader.pos;\n key = \"\";\n value = \"\";\n while (reader.pos < end2) {\n let tag2 = reader.tag();\n wireType = tag2 & 7;\n switch (tag2 >>>= 3) {\n case 1:\n if (wireType !== 2)\n break;\n key = reader.stringVerify();\n continue;\n case 2:\n if (wireType !== 2)\n break;\n value = reader.stringVerify();\n continue;\n }\n reader.skipType(wireType, _depth, tag2);\n }\n if (key === \"__proto__\")\n $util.makeProp(message.social, key);\n message.social[key] = value;\n continue;\n }\n case 13: {\n if (wireType !== 2)\n break;\n if (!(message.operationHours && message.operationHours.length))\n message.operationHours = [];\n message.operationHours.push($root.com.beco.location.OperationHour.decode(reader, reader.uint32(), $undefined, _depth + 1));\n continue;\n }\n case 14: {\n if (wireType !== 2)\n break;\n if (!(message.links && message.links.length))\n message.links = [];\n message.links.push($root.com.beco.location.Link.decode(reader, reader.uint32(), $undefined, _depth + 1));\n continue;\n }\n case 15: {\n if (wireType !== 2)\n break;\n if (!(message.siblingGroups && message.siblingGroups.length))\n message.siblingGroups = [];\n message.siblingGroups.push($root.com.beco.location.SiblingGroup.decode(reader, reader.uint32(), $undefined, _depth + 1));\n continue;\n }\n case 16: {\n if (wireType !== 0)\n break;\n if (value = reader.bool())\n message.showSmartLabelWhenImagePresent = value;\n else\n delete message.showSmartLabelWhenImagePresent;\n continue;\n }\n case 17: {\n if (wireType !== 2)\n break;\n if (!(message.categories && message.categories.length))\n message.categories = [];\n message.categories.push(reader.stringVerify());\n continue;\n }\n case 18: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.stateName = value;\n else\n delete message.stateName;\n continue;\n }\n case 19: {\n if (wireType !== 2)\n break;\n if (!(message.tags && message.tags.length))\n message.tags = [];\n message.tags.push(reader.stringVerify());\n continue;\n }\n case 20: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.address = value;\n else\n delete message.address;\n continue;\n }\n case 21: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.banner = value;\n else\n delete message.banner;\n continue;\n }\n case 22: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.logo = value;\n else\n delete message.logo;\n continue;\n }\n case 23: {\n if (wireType !== 2)\n break;\n message.zone = $root.com.beco.location.Zone.decode(reader, reader.uint32(), $undefined, _depth + 1, message.zone);\n continue;\n }\n case 24: {\n if (wireType !== 0)\n break;\n if (value = reader.bool())\n message.topLocation = value;\n else\n delete message.topLocation;\n continue;\n }\n case 25: {\n if (wireType !== 0)\n break;\n if (value = reader.bool())\n message.showLogo = value;\n else\n delete message.showLogo;\n continue;\n }\n case 26: {\n if (wireType !== 0)\n break;\n if (value = reader.int32())\n message.minZoom = value;\n else\n delete message.minZoom;\n continue;\n }\n case 27: {\n if (wireType !== 2)\n break;\n message.mapObject = $root.com.beco.location.MapObject.decode(reader, reader.uint32(), $undefined, _depth + 1, message.mapObject);\n continue;\n }\n case 28: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.area = value;\n else\n delete message.area;\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for Location\n * @function getTypeUrl\n * @memberof com.beco.location.Location\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n Location.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.location.Location\";\n };\n\n return Location;\n })();\n\n location.Zone = (function() {\n\n /**\n * Properties of a Zone.\n * @typedef {Object} com.beco.location.Zone.$Properties\n * @property {string|null} [zoneId] Zone zoneId\n * @property {string|null} [zoneName] Zone zoneName\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a Zone.\n * @memberof com.beco.location\n * @interface IZone\n * @augments com.beco.location.Zone.$Properties\n * @deprecated Use com.beco.location.Zone.$Properties instead.\n */\n\n /**\n * Shape of a Zone.\n * @typedef {com.beco.location.Zone.$Properties} com.beco.location.Zone.$Shape\n */\n\n /**\n * Constructs a new Zone.\n * @memberof com.beco.location\n * @classdesc Represents a Zone.\n * @constructor\n * @param {com.beco.location.Zone.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const Zone = function (properties) {\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * Zone zoneId.\n * @member {string} zoneId\n * @memberof com.beco.location.Zone\n * @instance\n */\n Zone.prototype.zoneId = \"\";\n\n /**\n * Zone zoneName.\n * @member {string} zoneName\n * @memberof com.beco.location.Zone\n * @instance\n */\n Zone.prototype.zoneName = \"\";\n\n /**\n * Creates a new Zone instance using the specified properties.\n * @function create\n * @memberof com.beco.location.Zone\n * @static\n * @param {com.beco.location.Zone.$Properties=} [properties] Properties to set\n * @returns {com.beco.location.Zone} Zone instance\n * @type {{\n * (properties: com.beco.location.Zone.$Shape): com.beco.location.Zone & com.beco.location.Zone.$Shape;\n * (properties?: com.beco.location.Zone.$Properties): com.beco.location.Zone;\n * }}\n */\n Zone.create = function(properties) {\n return new Zone(properties);\n };\n\n /**\n * Encodes the specified Zone message. Does not implicitly {@link com.beco.location.Zone.verify|verify} messages.\n * @function encode\n * @memberof com.beco.location.Zone\n * @static\n * @param {com.beco.location.Zone.$Properties} message Zone message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Zone.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.zoneId != null && $Object.hasOwnProperty.call(message, \"zoneId\") && message.zoneId !== \"\")\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.zoneId);\n if (message.zoneName != null && $Object.hasOwnProperty.call(message, \"zoneName\") && message.zoneName !== \"\")\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.zoneName);\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a Zone message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.location.Zone\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.location.Zone & com.beco.location.Zone.$Shape} Zone\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Zone.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.location.Zone(), value;\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.zoneId = value;\n else\n delete message.zoneId;\n continue;\n }\n case 2: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.zoneName = value;\n else\n delete message.zoneName;\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for Zone\n * @function getTypeUrl\n * @memberof com.beco.location.Zone\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n Zone.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.location.Zone\";\n };\n\n return Zone;\n })();\n\n location.Link = (function() {\n\n /**\n * Properties of a Link.\n * @typedef {Object} com.beco.location.Link.$Properties\n * @property {string|null} [url] Link url\n * @property {string|null} [label] Link label\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a Link.\n * @memberof com.beco.location\n * @interface ILink\n * @augments com.beco.location.Link.$Properties\n * @deprecated Use com.beco.location.Link.$Properties instead.\n */\n\n /**\n * Shape of a Link.\n * @typedef {com.beco.location.Link.$Properties} com.beco.location.Link.$Shape\n */\n\n /**\n * Constructs a new Link.\n * @memberof com.beco.location\n * @classdesc Represents a Link.\n * @constructor\n * @param {com.beco.location.Link.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const Link = function (properties) {\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * Link url.\n * @member {string} url\n * @memberof com.beco.location.Link\n * @instance\n */\n Link.prototype.url = \"\";\n\n /**\n * Link label.\n * @member {string} label\n * @memberof com.beco.location.Link\n * @instance\n */\n Link.prototype.label = \"\";\n\n /**\n * Creates a new Link instance using the specified properties.\n * @function create\n * @memberof com.beco.location.Link\n * @static\n * @param {com.beco.location.Link.$Properties=} [properties] Properties to set\n * @returns {com.beco.location.Link} Link instance\n * @type {{\n * (properties: com.beco.location.Link.$Shape): com.beco.location.Link & com.beco.location.Link.$Shape;\n * (properties?: com.beco.location.Link.$Properties): com.beco.location.Link;\n * }}\n */\n Link.create = function(properties) {\n return new Link(properties);\n };\n\n /**\n * Encodes the specified Link message. Does not implicitly {@link com.beco.location.Link.verify|verify} messages.\n * @function encode\n * @memberof com.beco.location.Link\n * @static\n * @param {com.beco.location.Link.$Properties} message Link message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Link.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.url != null && $Object.hasOwnProperty.call(message, \"url\") && message.url !== \"\")\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.url);\n if (message.label != null && $Object.hasOwnProperty.call(message, \"label\") && message.label !== \"\")\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.label);\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a Link message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.location.Link\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.location.Link & com.beco.location.Link.$Shape} Link\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Link.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.location.Link(), value;\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.url = value;\n else\n delete message.url;\n continue;\n }\n case 2: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.label = value;\n else\n delete message.label;\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for Link\n * @function getTypeUrl\n * @memberof com.beco.location.Link\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n Link.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.location.Link\";\n };\n\n return Link;\n })();\n\n location.SiblingGroup = (function() {\n\n /**\n * Properties of a SiblingGroup.\n * @typedef {Object} com.beco.location.SiblingGroup.$Properties\n * @property {string|null} [label] SiblingGroup label\n * @property {Array.<string>|null} [siblings] SiblingGroup siblings\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a SiblingGroup.\n * @memberof com.beco.location\n * @interface ISiblingGroup\n * @augments com.beco.location.SiblingGroup.$Properties\n * @deprecated Use com.beco.location.SiblingGroup.$Properties instead.\n */\n\n /**\n * Shape of a SiblingGroup.\n * @typedef {com.beco.location.SiblingGroup.$Properties} com.beco.location.SiblingGroup.$Shape\n */\n\n /**\n * Constructs a new SiblingGroup.\n * @memberof com.beco.location\n * @classdesc Represents a SiblingGroup.\n * @constructor\n * @param {com.beco.location.SiblingGroup.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const SiblingGroup = function (properties) {\n this.siblings = [];\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * SiblingGroup label.\n * @member {string} label\n * @memberof com.beco.location.SiblingGroup\n * @instance\n */\n SiblingGroup.prototype.label = \"\";\n\n /**\n * SiblingGroup siblings.\n * @member {Array.<string>} siblings\n * @memberof com.beco.location.SiblingGroup\n * @instance\n */\n SiblingGroup.prototype.siblings = $util.emptyArray;\n\n /**\n * Creates a new SiblingGroup instance using the specified properties.\n * @function create\n * @memberof com.beco.location.SiblingGroup\n * @static\n * @param {com.beco.location.SiblingGroup.$Properties=} [properties] Properties to set\n * @returns {com.beco.location.SiblingGroup} SiblingGroup instance\n * @type {{\n * (properties: com.beco.location.SiblingGroup.$Shape): com.beco.location.SiblingGroup & com.beco.location.SiblingGroup.$Shape;\n * (properties?: com.beco.location.SiblingGroup.$Properties): com.beco.location.SiblingGroup;\n * }}\n */\n SiblingGroup.create = function(properties) {\n return new SiblingGroup(properties);\n };\n\n /**\n * Encodes the specified SiblingGroup message. Does not implicitly {@link com.beco.location.SiblingGroup.verify|verify} messages.\n * @function encode\n * @memberof com.beco.location.SiblingGroup\n * @static\n * @param {com.beco.location.SiblingGroup.$Properties} message SiblingGroup message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n SiblingGroup.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.label != null && $Object.hasOwnProperty.call(message, \"label\") && message.label !== \"\")\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.label);\n if (message.siblings != null && message.siblings.length)\n for (let i = 0; i < message.siblings.length; ++i)\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.siblings[i]);\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a SiblingGroup message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.location.SiblingGroup\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.location.SiblingGroup & com.beco.location.SiblingGroup.$Shape} SiblingGroup\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n SiblingGroup.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.location.SiblingGroup(), value;\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.label = value;\n else\n delete message.label;\n continue;\n }\n case 2: {\n if (wireType !== 2)\n break;\n if (!(message.siblings && message.siblings.length))\n message.siblings = [];\n message.siblings.push(reader.stringVerify());\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for SiblingGroup\n * @function getTypeUrl\n * @memberof com.beco.location.SiblingGroup\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n SiblingGroup.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.location.SiblingGroup\";\n };\n\n return SiblingGroup;\n })();\n\n location.OperationHour = (function() {\n\n /**\n * Properties of an OperationHour.\n * @typedef {Object} com.beco.location.OperationHour.$Properties\n * @property {string|null} [opens] OperationHour opens\n * @property {string|null} [closes] OperationHour closes\n * @property {Array.<string>|null} [dayOfWeek] OperationHour dayOfWeek\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of an OperationHour.\n * @memberof com.beco.location\n * @interface IOperationHour\n * @augments com.beco.location.OperationHour.$Properties\n * @deprecated Use com.beco.location.OperationHour.$Properties instead.\n */\n\n /**\n * Shape of an OperationHour.\n * @typedef {com.beco.location.OperationHour.$Properties} com.beco.location.OperationHour.$Shape\n */\n\n /**\n * Constructs a new OperationHour.\n * @memberof com.beco.location\n * @classdesc Represents an OperationHour.\n * @constructor\n * @param {com.beco.location.OperationHour.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const OperationHour = function (properties) {\n this.dayOfWeek = [];\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * OperationHour opens.\n * @member {string} opens\n * @memberof com.beco.location.OperationHour\n * @instance\n */\n OperationHour.prototype.opens = \"\";\n\n /**\n * OperationHour closes.\n * @member {string} closes\n * @memberof com.beco.location.OperationHour\n * @instance\n */\n OperationHour.prototype.closes = \"\";\n\n /**\n * OperationHour dayOfWeek.\n * @member {Array.<string>} dayOfWeek\n * @memberof com.beco.location.OperationHour\n * @instance\n */\n OperationHour.prototype.dayOfWeek = $util.emptyArray;\n\n /**\n * Creates a new OperationHour instance using the specified properties.\n * @function create\n * @memberof com.beco.location.OperationHour\n * @static\n * @param {com.beco.location.OperationHour.$Properties=} [properties] Properties to set\n * @returns {com.beco.location.OperationHour} OperationHour instance\n * @type {{\n * (properties: com.beco.location.OperationHour.$Shape): com.beco.location.OperationHour & com.beco.location.OperationHour.$Shape;\n * (properties?: com.beco.location.OperationHour.$Properties): com.beco.location.OperationHour;\n * }}\n */\n OperationHour.create = function(properties) {\n return new OperationHour(properties);\n };\n\n /**\n * Encodes the specified OperationHour message. Does not implicitly {@link com.beco.location.OperationHour.verify|verify} messages.\n * @function encode\n * @memberof com.beco.location.OperationHour\n * @static\n * @param {com.beco.location.OperationHour.$Properties} message OperationHour message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n OperationHour.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.opens != null && $Object.hasOwnProperty.call(message, \"opens\") && message.opens !== \"\")\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.opens);\n if (message.closes != null && $Object.hasOwnProperty.call(message, \"closes\") && message.closes !== \"\")\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.closes);\n if (message.dayOfWeek != null && message.dayOfWeek.length)\n for (let i = 0; i < message.dayOfWeek.length; ++i)\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.dayOfWeek[i]);\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes an OperationHour message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.location.OperationHour\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.location.OperationHour & com.beco.location.OperationHour.$Shape} OperationHour\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n OperationHour.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.location.OperationHour(), value;\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.opens = value;\n else\n delete message.opens;\n continue;\n }\n case 2: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.closes = value;\n else\n delete message.closes;\n continue;\n }\n case 3: {\n if (wireType !== 2)\n break;\n if (!(message.dayOfWeek && message.dayOfWeek.length))\n message.dayOfWeek = [];\n message.dayOfWeek.push(reader.stringVerify());\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for OperationHour\n * @function getTypeUrl\n * @memberof com.beco.location.OperationHour\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n OperationHour.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.location.OperationHour\";\n };\n\n return OperationHour;\n })();\n\n location.MapObject = (function() {\n\n /**\n * Properties of a MapObject.\n * @typedef {Object} com.beco.location.MapObject.$Properties\n * @property {string|null} [modelPath] MapObject modelPath\n * @property {number|null} [scale] MapObject scale\n * @property {number|null} [rotation] MapObject rotation\n * @property {number|null} [modelAltitude] MapObject modelAltitude\n * @property {number|null} [modelLight] MapObject modelLight\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a MapObject.\n * @memberof com.beco.location\n * @interface IMapObject\n * @augments com.beco.location.MapObject.$Properties\n * @deprecated Use com.beco.location.MapObject.$Properties instead.\n */\n\n /**\n * Shape of a MapObject.\n * @typedef {com.beco.location.MapObject.$Properties} com.beco.location.MapObject.$Shape\n */\n\n /**\n * Constructs a new MapObject.\n * @memberof com.beco.location\n * @classdesc Represents a MapObject.\n * @constructor\n * @param {com.beco.location.MapObject.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const MapObject = function (properties) {\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * MapObject modelPath.\n * @member {string} modelPath\n * @memberof com.beco.location.MapObject\n * @instance\n */\n MapObject.prototype.modelPath = \"\";\n\n /**\n * MapObject scale.\n * @member {number} scale\n * @memberof com.beco.location.MapObject\n * @instance\n */\n MapObject.prototype.scale = 0;\n\n /**\n * MapObject rotation.\n * @member {number} rotation\n * @memberof com.beco.location.MapObject\n * @instance\n */\n MapObject.prototype.rotation = 0;\n\n /**\n * MapObject modelAltitude.\n * @member {number} modelAltitude\n * @memberof com.beco.location.MapObject\n * @instance\n */\n MapObject.prototype.modelAltitude = 0;\n\n /**\n * MapObject modelLight.\n * @member {number} modelLight\n * @memberof com.beco.location.MapObject\n * @instance\n */\n MapObject.prototype.modelLight = 0;\n\n /**\n * Creates a new MapObject instance using the specified properties.\n * @function create\n * @memberof com.beco.location.MapObject\n * @static\n * @param {com.beco.location.MapObject.$Properties=} [properties] Properties to set\n * @returns {com.beco.location.MapObject} MapObject instance\n * @type {{\n * (properties: com.beco.location.MapObject.$Shape): com.beco.location.MapObject & com.beco.location.MapObject.$Shape;\n * (properties?: com.beco.location.MapObject.$Properties): com.beco.location.MapObject;\n * }}\n */\n MapObject.create = function(properties) {\n return new MapObject(properties);\n };\n\n /**\n * Encodes the specified MapObject message. Does not implicitly {@link com.beco.location.MapObject.verify|verify} messages.\n * @function encode\n * @memberof com.beco.location.MapObject\n * @static\n * @param {com.beco.location.MapObject.$Properties} message MapObject message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n MapObject.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.modelPath != null && $Object.hasOwnProperty.call(message, \"modelPath\") && message.modelPath !== \"\")\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.modelPath);\n if (message.scale != null && $Object.hasOwnProperty.call(message, \"scale\") && !$Object.is(message.scale, 0))\n writer.uint32(/* id 2, wireType 1 =*/17).double(message.scale);\n if (message.rotation != null && $Object.hasOwnProperty.call(message, \"rotation\") && !$Object.is(message.rotation, 0))\n writer.uint32(/* id 3, wireType 1 =*/25).double(message.rotation);\n if (message.modelAltitude != null && $Object.hasOwnProperty.call(message, \"modelAltitude\") && !$Object.is(message.modelAltitude, 0))\n writer.uint32(/* id 4, wireType 1 =*/33).double(message.modelAltitude);\n if (message.modelLight != null && $Object.hasOwnProperty.call(message, \"modelLight\") && !$Object.is(message.modelLight, 0))\n writer.uint32(/* id 5, wireType 1 =*/41).double(message.modelLight);\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a MapObject message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.location.MapObject\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.location.MapObject & com.beco.location.MapObject.$Shape} MapObject\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n MapObject.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.location.MapObject(), value;\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.modelPath = value;\n else\n delete message.modelPath;\n continue;\n }\n case 2: {\n if (wireType !== 1)\n break;\n if (!$Object.is(value = reader.double(), 0))\n message.scale = value;\n else\n delete message.scale;\n continue;\n }\n case 3: {\n if (wireType !== 1)\n break;\n if (!$Object.is(value = reader.double(), 0))\n message.rotation = value;\n else\n delete message.rotation;\n continue;\n }\n case 4: {\n if (wireType !== 1)\n break;\n if (!$Object.is(value = reader.double(), 0))\n message.modelAltitude = value;\n else\n delete message.modelAltitude;\n continue;\n }\n case 5: {\n if (wireType !== 1)\n break;\n if (!$Object.is(value = reader.double(), 0))\n message.modelLight = value;\n else\n delete message.modelLight;\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for MapObject\n * @function getTypeUrl\n * @memberof com.beco.location.MapObject\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n MapObject.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.location.MapObject\";\n };\n\n return MapObject;\n })();\n\n location.LocationList = (function() {\n\n /**\n * Properties of a LocationList.\n * @typedef {Object} com.beco.location.LocationList.$Properties\n * @property {Array.<com.beco.location.Location.$Properties>|null} [locations] LocationList locations\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a LocationList.\n * @memberof com.beco.location\n * @interface ILocationList\n * @augments com.beco.location.LocationList.$Properties\n * @deprecated Use com.beco.location.LocationList.$Properties instead.\n */\n\n /**\n * Shape of a LocationList.\n * @typedef {com.beco.location.LocationList.$Properties} com.beco.location.LocationList.$Shape\n */\n\n /**\n * Constructs a new LocationList.\n * @memberof com.beco.location\n * @classdesc Represents a LocationList.\n * @constructor\n * @param {com.beco.location.LocationList.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const LocationList = function (properties) {\n this.locations = [];\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * LocationList locations.\n * @member {Array.<com.beco.location.Location.$Properties>} locations\n * @memberof com.beco.location.LocationList\n * @instance\n */\n LocationList.prototype.locations = $util.emptyArray;\n\n /**\n * Creates a new LocationList instance using the specified properties.\n * @function create\n * @memberof com.beco.location.LocationList\n * @static\n * @param {com.beco.location.LocationList.$Properties=} [properties] Properties to set\n * @returns {com.beco.location.LocationList} LocationList instance\n * @type {{\n * (properties: com.beco.location.LocationList.$Shape): com.beco.location.LocationList & com.beco.location.LocationList.$Shape;\n * (properties?: com.beco.location.LocationList.$Properties): com.beco.location.LocationList;\n * }}\n */\n LocationList.create = function(properties) {\n return new LocationList(properties);\n };\n\n /**\n * Encodes the specified LocationList message. Does not implicitly {@link com.beco.location.LocationList.verify|verify} messages.\n * @function encode\n * @memberof com.beco.location.LocationList\n * @static\n * @param {com.beco.location.LocationList.$Properties} message LocationList message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n LocationList.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.locations != null && message.locations.length)\n for (let i = 0; i < message.locations.length; ++i)\n $root.com.beco.location.Location.encode(message.locations[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), _depth + 1).ldelim();\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a LocationList message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.location.LocationList\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.location.LocationList & com.beco.location.LocationList.$Shape} LocationList\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n LocationList.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.location.LocationList();\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if (!(message.locations && message.locations.length))\n message.locations = [];\n message.locations.push($root.com.beco.location.Location.decode(reader, reader.uint32(), $undefined, _depth + 1));\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for LocationList\n * @function getTypeUrl\n * @memberof com.beco.location.LocationList\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n LocationList.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.location.LocationList\";\n };\n\n return LocationList;\n })();\n\n return location;\n })();\n\n beco.map_object = (function() {\n\n /**\n * Namespace map_object.\n * @memberof com.beco\n * @namespace\n */\n const map_object = {};\n\n map_object.MapObject = (function() {\n\n /**\n * Properties of a MapObject.\n * @typedef {Object} com.beco.map_object.MapObject.$Properties\n * @property {string|null} [id] MapObject id\n * @property {string|null} [siteId] MapObject siteId\n * @property {string|null} [nodeId] MapObject nodeId\n * @property {string|null} [mapObjectPath] MapObject mapObjectPath\n * @property {number|null} [scale] MapObject scale\n * @property {number|null} [rotation] MapObject rotation\n * @property {number|null} [altitude] MapObject altitude\n * @property {number|null} [light] MapObject light\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a MapObject.\n * @memberof com.beco.map_object\n * @interface IMapObject\n * @augments com.beco.map_object.MapObject.$Properties\n * @deprecated Use com.beco.map_object.MapObject.$Properties instead.\n */\n\n /**\n * Shape of a MapObject.\n * @typedef {com.beco.map_object.MapObject.$Properties} com.beco.map_object.MapObject.$Shape\n */\n\n /**\n * Constructs a new MapObject.\n * @memberof com.beco.map_object\n * @classdesc Represents a MapObject.\n * @constructor\n * @param {com.beco.map_object.MapObject.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const MapObject = function (properties) {\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * MapObject id.\n * @member {string} id\n * @memberof com.beco.map_object.MapObject\n * @instance\n */\n MapObject.prototype.id = \"\";\n\n /**\n * MapObject siteId.\n * @member {string} siteId\n * @memberof com.beco.map_object.MapObject\n * @instance\n */\n MapObject.prototype.siteId = \"\";\n\n /**\n * MapObject nodeId.\n * @member {string} nodeId\n * @memberof com.beco.map_object.MapObject\n * @instance\n */\n MapObject.prototype.nodeId = \"\";\n\n /**\n * MapObject mapObjectPath.\n * @member {string} mapObjectPath\n * @memberof com.beco.map_object.MapObject\n * @instance\n */\n MapObject.prototype.mapObjectPath = \"\";\n\n /**\n * MapObject scale.\n * @member {number} scale\n * @memberof com.beco.map_object.MapObject\n * @instance\n */\n MapObject.prototype.scale = 0;\n\n /**\n * MapObject rotation.\n * @member {number} rotation\n * @memberof com.beco.map_object.MapObject\n * @instance\n */\n MapObject.prototype.rotation = 0;\n\n /**\n * MapObject altitude.\n * @member {number} altitude\n * @memberof com.beco.map_object.MapObject\n * @instance\n */\n MapObject.prototype.altitude = 0;\n\n /**\n * MapObject light.\n * @member {number} light\n * @memberof com.beco.map_object.MapObject\n * @instance\n */\n MapObject.prototype.light = 0;\n\n /**\n * Creates a new MapObject instance using the specified properties.\n * @function create\n * @memberof com.beco.map_object.MapObject\n * @static\n * @param {com.beco.map_object.MapObject.$Properties=} [properties] Properties to set\n * @returns {com.beco.map_object.MapObject} MapObject instance\n * @type {{\n * (properties: com.beco.map_object.MapObject.$Shape): com.beco.map_object.MapObject & com.beco.map_object.MapObject.$Shape;\n * (properties?: com.beco.map_object.MapObject.$Properties): com.beco.map_object.MapObject;\n * }}\n */\n MapObject.create = function(properties) {\n return new MapObject(properties);\n };\n\n /**\n * Encodes the specified MapObject message. Does not implicitly {@link com.beco.map_object.MapObject.verify|verify} messages.\n * @function encode\n * @memberof com.beco.map_object.MapObject\n * @static\n * @param {com.beco.map_object.MapObject.$Properties} message MapObject message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n MapObject.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.id != null && $Object.hasOwnProperty.call(message, \"id\") && message.id !== \"\")\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.id);\n if (message.siteId != null && $Object.hasOwnProperty.call(message, \"siteId\") && message.siteId !== \"\")\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.siteId);\n if (message.nodeId != null && $Object.hasOwnProperty.call(message, \"nodeId\") && message.nodeId !== \"\")\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.nodeId);\n if (message.mapObjectPath != null && $Object.hasOwnProperty.call(message, \"mapObjectPath\") && message.mapObjectPath !== \"\")\n writer.uint32(/* id 4, wireType 2 =*/34).string(message.mapObjectPath);\n if (message.scale != null && $Object.hasOwnProperty.call(message, \"scale\") && !$Object.is(message.scale, 0))\n writer.uint32(/* id 5, wireType 1 =*/41).double(message.scale);\n if (message.rotation != null && $Object.hasOwnProperty.call(message, \"rotation\") && !$Object.is(message.rotation, 0))\n writer.uint32(/* id 6, wireType 1 =*/49).double(message.rotation);\n if (message.altitude != null && $Object.hasOwnProperty.call(message, \"altitude\") && !$Object.is(message.altitude, 0))\n writer.uint32(/* id 7, wireType 1 =*/57).double(message.altitude);\n if (message.light != null && $Object.hasOwnProperty.call(message, \"light\") && !$Object.is(message.light, 0))\n writer.uint32(/* id 8, wireType 1 =*/65).double(message.light);\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a MapObject message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.map_object.MapObject\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.map_object.MapObject & com.beco.map_object.MapObject.$Shape} MapObject\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n MapObject.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.map_object.MapObject(), value;\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.id = value;\n else\n delete message.id;\n continue;\n }\n case 2: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.siteId = value;\n else\n delete message.siteId;\n continue;\n }\n case 3: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.nodeId = value;\n else\n delete message.nodeId;\n continue;\n }\n case 4: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.mapObjectPath = value;\n else\n delete message.mapObjectPath;\n continue;\n }\n case 5: {\n if (wireType !== 1)\n break;\n if (!$Object.is(value = reader.double(), 0))\n message.scale = value;\n else\n delete message.scale;\n continue;\n }\n case 6: {\n if (wireType !== 1)\n break;\n if (!$Object.is(value = reader.double(), 0))\n message.rotation = value;\n else\n delete message.rotation;\n continue;\n }\n case 7: {\n if (wireType !== 1)\n break;\n if (!$Object.is(value = reader.double(), 0))\n message.altitude = value;\n else\n delete message.altitude;\n continue;\n }\n case 8: {\n if (wireType !== 1)\n break;\n if (!$Object.is(value = reader.double(), 0))\n message.light = value;\n else\n delete message.light;\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for MapObject\n * @function getTypeUrl\n * @memberof com.beco.map_object.MapObject\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n MapObject.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.map_object.MapObject\";\n };\n\n return MapObject;\n })();\n\n map_object.MapObjectsList = (function() {\n\n /**\n * Properties of a MapObjectsList.\n * @typedef {Object} com.beco.map_object.MapObjectsList.$Properties\n * @property {Array.<com.beco.map_object.MapObject.$Properties>|null} [mapObjects] MapObjectsList mapObjects\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a MapObjectsList.\n * @memberof com.beco.map_object\n * @interface IMapObjectsList\n * @augments com.beco.map_object.MapObjectsList.$Properties\n * @deprecated Use com.beco.map_object.MapObjectsList.$Properties instead.\n */\n\n /**\n * Shape of a MapObjectsList.\n * @typedef {com.beco.map_object.MapObjectsList.$Properties} com.beco.map_object.MapObjectsList.$Shape\n */\n\n /**\n * Constructs a new MapObjectsList.\n * @memberof com.beco.map_object\n * @classdesc Represents a MapObjectsList.\n * @constructor\n * @param {com.beco.map_object.MapObjectsList.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const MapObjectsList = function (properties) {\n this.mapObjects = [];\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * MapObjectsList mapObjects.\n * @member {Array.<com.beco.map_object.MapObject.$Properties>} mapObjects\n * @memberof com.beco.map_object.MapObjectsList\n * @instance\n */\n MapObjectsList.prototype.mapObjects = $util.emptyArray;\n\n /**\n * Creates a new MapObjectsList instance using the specified properties.\n * @function create\n * @memberof com.beco.map_object.MapObjectsList\n * @static\n * @param {com.beco.map_object.MapObjectsList.$Properties=} [properties] Properties to set\n * @returns {com.beco.map_object.MapObjectsList} MapObjectsList instance\n * @type {{\n * (properties: com.beco.map_object.MapObjectsList.$Shape): com.beco.map_object.MapObjectsList & com.beco.map_object.MapObjectsList.$Shape;\n * (properties?: com.beco.map_object.MapObjectsList.$Properties): com.beco.map_object.MapObjectsList;\n * }}\n */\n MapObjectsList.create = function(properties) {\n return new MapObjectsList(properties);\n };\n\n /**\n * Encodes the specified MapObjectsList message. Does not implicitly {@link com.beco.map_object.MapObjectsList.verify|verify} messages.\n * @function encode\n * @memberof com.beco.map_object.MapObjectsList\n * @static\n * @param {com.beco.map_object.MapObjectsList.$Properties} message MapObjectsList message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n MapObjectsList.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.mapObjects != null && message.mapObjects.length)\n for (let i = 0; i < message.mapObjects.length; ++i)\n $root.com.beco.map_object.MapObject.encode(message.mapObjects[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), _depth + 1).ldelim();\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a MapObjectsList message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.map_object.MapObjectsList\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.map_object.MapObjectsList & com.beco.map_object.MapObjectsList.$Shape} MapObjectsList\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n MapObjectsList.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.map_object.MapObjectsList();\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if (!(message.mapObjects && message.mapObjects.length))\n message.mapObjects = [];\n message.mapObjects.push($root.com.beco.map_object.MapObject.decode(reader, reader.uint32(), $undefined, _depth + 1));\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for MapObjectsList\n * @function getTypeUrl\n * @memberof com.beco.map_object.MapObjectsList\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n MapObjectsList.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.map_object.MapObjectsList\";\n };\n\n return MapObjectsList;\n })();\n\n return map_object;\n })();\n\n beco.node = (function() {\n\n /**\n * Namespace node.\n * @memberof com.beco\n * @namespace\n */\n const node = {};\n\n node.Node = (function() {\n\n /**\n * Properties of a Node.\n * @typedef {Object} com.beco.node.Node.$Properties\n * @property {string|null} [nodeId] Node nodeId\n * @property {number|null} [lat] Node lat\n * @property {number|null} [lng] Node lng\n * @property {boolean|null} [accessible] Node accessible\n * @property {string|null} [floorId] Node floorId\n * @property {Array.<string>|null} [siblings] Node siblings\n * @property {boolean|null} [privateNode] Node privateNode\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a Node.\n * @memberof com.beco.node\n * @interface INode\n * @augments com.beco.node.Node.$Properties\n * @deprecated Use com.beco.node.Node.$Properties instead.\n */\n\n /**\n * Shape of a Node.\n * @typedef {com.beco.node.Node.$Properties} com.beco.node.Node.$Shape\n */\n\n /**\n * Constructs a new Node.\n * @memberof com.beco.node\n * @classdesc Represents a Node.\n * @constructor\n * @param {com.beco.node.Node.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const Node = function (properties) {\n this.siblings = [];\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * Node nodeId.\n * @member {string} nodeId\n * @memberof com.beco.node.Node\n * @instance\n */\n Node.prototype.nodeId = \"\";\n\n /**\n * Node lat.\n * @member {number} lat\n * @memberof com.beco.node.Node\n * @instance\n */\n Node.prototype.lat = 0;\n\n /**\n * Node lng.\n * @member {number} lng\n * @memberof com.beco.node.Node\n * @instance\n */\n Node.prototype.lng = 0;\n\n /**\n * Node accessible.\n * @member {boolean} accessible\n * @memberof com.beco.node.Node\n * @instance\n */\n Node.prototype.accessible = false;\n\n /**\n * Node floorId.\n * @member {string} floorId\n * @memberof com.beco.node.Node\n * @instance\n */\n Node.prototype.floorId = \"\";\n\n /**\n * Node siblings.\n * @member {Array.<string>} siblings\n * @memberof com.beco.node.Node\n * @instance\n */\n Node.prototype.siblings = $util.emptyArray;\n\n /**\n * Node privateNode.\n * @member {boolean} privateNode\n * @memberof com.beco.node.Node\n * @instance\n */\n Node.prototype.privateNode = false;\n\n /**\n * Creates a new Node instance using the specified properties.\n * @function create\n * @memberof com.beco.node.Node\n * @static\n * @param {com.beco.node.Node.$Properties=} [properties] Properties to set\n * @returns {com.beco.node.Node} Node instance\n * @type {{\n * (properties: com.beco.node.Node.$Shape): com.beco.node.Node & com.beco.node.Node.$Shape;\n * (properties?: com.beco.node.Node.$Properties): com.beco.node.Node;\n * }}\n */\n Node.create = function(properties) {\n return new Node(properties);\n };\n\n /**\n * Encodes the specified Node message. Does not implicitly {@link com.beco.node.Node.verify|verify} messages.\n * @function encode\n * @memberof com.beco.node.Node\n * @static\n * @param {com.beco.node.Node.$Properties} message Node message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Node.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.nodeId != null && $Object.hasOwnProperty.call(message, \"nodeId\") && message.nodeId !== \"\")\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.nodeId);\n if (message.lat != null && $Object.hasOwnProperty.call(message, \"lat\") && !$Object.is(message.lat, 0))\n writer.uint32(/* id 2, wireType 1 =*/17).double(message.lat);\n if (message.lng != null && $Object.hasOwnProperty.call(message, \"lng\") && !$Object.is(message.lng, 0))\n writer.uint32(/* id 3, wireType 1 =*/25).double(message.lng);\n if (message.accessible != null && $Object.hasOwnProperty.call(message, \"accessible\") && message.accessible !== false)\n writer.uint32(/* id 4, wireType 0 =*/32).bool(message.accessible);\n if (message.floorId != null && $Object.hasOwnProperty.call(message, \"floorId\") && message.floorId !== \"\")\n writer.uint32(/* id 5, wireType 2 =*/42).string(message.floorId);\n if (message.siblings != null && message.siblings.length)\n for (let i = 0; i < message.siblings.length; ++i)\n writer.uint32(/* id 6, wireType 2 =*/50).string(message.siblings[i]);\n if (message.privateNode != null && $Object.hasOwnProperty.call(message, \"privateNode\") && message.privateNode !== false)\n writer.uint32(/* id 7, wireType 0 =*/56).bool(message.privateNode);\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a Node message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.node.Node\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.node.Node & com.beco.node.Node.$Shape} Node\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Node.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.node.Node(), value;\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.nodeId = value;\n else\n delete message.nodeId;\n continue;\n }\n case 2: {\n if (wireType !== 1)\n break;\n if (!$Object.is(value = reader.double(), 0))\n message.lat = value;\n else\n delete message.lat;\n continue;\n }\n case 3: {\n if (wireType !== 1)\n break;\n if (!$Object.is(value = reader.double(), 0))\n message.lng = value;\n else\n delete message.lng;\n continue;\n }\n case 4: {\n if (wireType !== 0)\n break;\n if (value = reader.bool())\n message.accessible = value;\n else\n delete message.accessible;\n continue;\n }\n case 5: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.floorId = value;\n else\n delete message.floorId;\n continue;\n }\n case 6: {\n if (wireType !== 2)\n break;\n if (!(message.siblings && message.siblings.length))\n message.siblings = [];\n message.siblings.push(reader.stringVerify());\n continue;\n }\n case 7: {\n if (wireType !== 0)\n break;\n if (value = reader.bool())\n message.privateNode = value;\n else\n delete message.privateNode;\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for Node\n * @function getTypeUrl\n * @memberof com.beco.node.Node\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n Node.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.node.Node\";\n };\n\n return Node;\n })();\n\n node.NodeList = (function() {\n\n /**\n * Properties of a NodeList.\n * @typedef {Object} com.beco.node.NodeList.$Properties\n * @property {Array.<com.beco.node.Node.$Properties>|null} [nodes] NodeList nodes\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a NodeList.\n * @memberof com.beco.node\n * @interface INodeList\n * @augments com.beco.node.NodeList.$Properties\n * @deprecated Use com.beco.node.NodeList.$Properties instead.\n */\n\n /**\n * Shape of a NodeList.\n * @typedef {com.beco.node.NodeList.$Properties} com.beco.node.NodeList.$Shape\n */\n\n /**\n * Constructs a new NodeList.\n * @memberof com.beco.node\n * @classdesc Represents a NodeList.\n * @constructor\n * @param {com.beco.node.NodeList.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const NodeList = function (properties) {\n this.nodes = [];\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * NodeList nodes.\n * @member {Array.<com.beco.node.Node.$Properties>} nodes\n * @memberof com.beco.node.NodeList\n * @instance\n */\n NodeList.prototype.nodes = $util.emptyArray;\n\n /**\n * Creates a new NodeList instance using the specified properties.\n * @function create\n * @memberof com.beco.node.NodeList\n * @static\n * @param {com.beco.node.NodeList.$Properties=} [properties] Properties to set\n * @returns {com.beco.node.NodeList} NodeList instance\n * @type {{\n * (properties: com.beco.node.NodeList.$Shape): com.beco.node.NodeList & com.beco.node.NodeList.$Shape;\n * (properties?: com.beco.node.NodeList.$Properties): com.beco.node.NodeList;\n * }}\n */\n NodeList.create = function(properties) {\n return new NodeList(properties);\n };\n\n /**\n * Encodes the specified NodeList message. Does not implicitly {@link com.beco.node.NodeList.verify|verify} messages.\n * @function encode\n * @memberof com.beco.node.NodeList\n * @static\n * @param {com.beco.node.NodeList.$Properties} message NodeList message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n NodeList.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.nodes != null && message.nodes.length)\n for (let i = 0; i < message.nodes.length; ++i)\n $root.com.beco.node.Node.encode(message.nodes[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), _depth + 1).ldelim();\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a NodeList message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.node.NodeList\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.node.NodeList & com.beco.node.NodeList.$Shape} NodeList\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n NodeList.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.node.NodeList();\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if (!(message.nodes && message.nodes.length))\n message.nodes = [];\n message.nodes.push($root.com.beco.node.Node.decode(reader, reader.uint32(), $undefined, _depth + 1));\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for NodeList\n * @function getTypeUrl\n * @memberof com.beco.node.NodeList\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n NodeList.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.node.NodeList\";\n };\n\n return NodeList;\n })();\n\n return node;\n })();\n\n beco.geoshapes = (function() {\n\n /**\n * Namespace geoshapes.\n * @memberof com.beco\n * @namespace\n */\n const geoshapes = {};\n\n geoshapes.GeoShapes = (function() {\n\n /**\n * Properties of a GeoShapes.\n * @typedef {Object} com.beco.geoshapes.GeoShapes.$Properties\n * @property {string|null} [shapeId] GeoShapes shapeId\n * @property {string|null} [jsonData] GeoShapes jsonData\n * @property {string|null} [type] GeoShapes type\n * @property {string|null} [floorId] GeoShapes floorId\n * @property {string|null} [siteId] GeoShapes siteId\n * @property {string|null} [layerId] GeoShapes layerId\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a GeoShapes.\n * @memberof com.beco.geoshapes\n * @interface IGeoShapes\n * @augments com.beco.geoshapes.GeoShapes.$Properties\n * @deprecated Use com.beco.geoshapes.GeoShapes.$Properties instead.\n */\n\n /**\n * Shape of a GeoShapes.\n * @typedef {com.beco.geoshapes.GeoShapes.$Properties} com.beco.geoshapes.GeoShapes.$Shape\n */\n\n /**\n * Constructs a new GeoShapes.\n * @memberof com.beco.geoshapes\n * @classdesc Represents a GeoShapes.\n * @constructor\n * @param {com.beco.geoshapes.GeoShapes.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const GeoShapes = function (properties) {\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * GeoShapes shapeId.\n * @member {string} shapeId\n * @memberof com.beco.geoshapes.GeoShapes\n * @instance\n */\n GeoShapes.prototype.shapeId = \"\";\n\n /**\n * GeoShapes jsonData.\n * @member {string} jsonData\n * @memberof com.beco.geoshapes.GeoShapes\n * @instance\n */\n GeoShapes.prototype.jsonData = \"\";\n\n /**\n * GeoShapes type.\n * @member {string} type\n * @memberof com.beco.geoshapes.GeoShapes\n * @instance\n */\n GeoShapes.prototype.type = \"\";\n\n /**\n * GeoShapes floorId.\n * @member {string} floorId\n * @memberof com.beco.geoshapes.GeoShapes\n * @instance\n */\n GeoShapes.prototype.floorId = \"\";\n\n /**\n * GeoShapes siteId.\n * @member {string} siteId\n * @memberof com.beco.geoshapes.GeoShapes\n * @instance\n */\n GeoShapes.prototype.siteId = \"\";\n\n /**\n * GeoShapes layerId.\n * @member {string} layerId\n * @memberof com.beco.geoshapes.GeoShapes\n * @instance\n */\n GeoShapes.prototype.layerId = \"\";\n\n /**\n * Creates a new GeoShapes instance using the specified properties.\n * @function create\n * @memberof com.beco.geoshapes.GeoShapes\n * @static\n * @param {com.beco.geoshapes.GeoShapes.$Properties=} [properties] Properties to set\n * @returns {com.beco.geoshapes.GeoShapes} GeoShapes instance\n * @type {{\n * (properties: com.beco.geoshapes.GeoShapes.$Shape): com.beco.geoshapes.GeoShapes & com.beco.geoshapes.GeoShapes.$Shape;\n * (properties?: com.beco.geoshapes.GeoShapes.$Properties): com.beco.geoshapes.GeoShapes;\n * }}\n */\n GeoShapes.create = function(properties) {\n return new GeoShapes(properties);\n };\n\n /**\n * Encodes the specified GeoShapes message. Does not implicitly {@link com.beco.geoshapes.GeoShapes.verify|verify} messages.\n * @function encode\n * @memberof com.beco.geoshapes.GeoShapes\n * @static\n * @param {com.beco.geoshapes.GeoShapes.$Properties} message GeoShapes message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n GeoShapes.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.shapeId != null && $Object.hasOwnProperty.call(message, \"shapeId\") && message.shapeId !== \"\")\n writer.uint32(/* id 1, wireType 2 =*/10).string(message.shapeId);\n if (message.jsonData != null && $Object.hasOwnProperty.call(message, \"jsonData\") && message.jsonData !== \"\")\n writer.uint32(/* id 2, wireType 2 =*/18).string(message.jsonData);\n if (message.type != null && $Object.hasOwnProperty.call(message, \"type\") && message.type !== \"\")\n writer.uint32(/* id 3, wireType 2 =*/26).string(message.type);\n if (message.floorId != null && $Object.hasOwnProperty.call(message, \"floorId\") && message.floorId !== \"\")\n writer.uint32(/* id 4, wireType 2 =*/34).string(message.floorId);\n if (message.siteId != null && $Object.hasOwnProperty.call(message, \"siteId\") && message.siteId !== \"\")\n writer.uint32(/* id 5, wireType 2 =*/42).string(message.siteId);\n if (message.layerId != null && $Object.hasOwnProperty.call(message, \"layerId\") && message.layerId !== \"\")\n writer.uint32(/* id 6, wireType 2 =*/50).string(message.layerId);\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a GeoShapes message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.geoshapes.GeoShapes\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.geoshapes.GeoShapes & com.beco.geoshapes.GeoShapes.$Shape} GeoShapes\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n GeoShapes.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.geoshapes.GeoShapes(), value;\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.shapeId = value;\n else\n delete message.shapeId;\n continue;\n }\n case 2: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.jsonData = value;\n else\n delete message.jsonData;\n continue;\n }\n case 3: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.type = value;\n else\n delete message.type;\n continue;\n }\n case 4: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.floorId = value;\n else\n delete message.floorId;\n continue;\n }\n case 5: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.siteId = value;\n else\n delete message.siteId;\n continue;\n }\n case 6: {\n if (wireType !== 2)\n break;\n if ((value = reader.stringVerify()).length)\n message.layerId = value;\n else\n delete message.layerId;\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for GeoShapes\n * @function getTypeUrl\n * @memberof com.beco.geoshapes.GeoShapes\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n GeoShapes.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.geoshapes.GeoShapes\";\n };\n\n return GeoShapes;\n })();\n\n geoshapes.GeoShapesList = (function() {\n\n /**\n * Properties of a GeoShapesList.\n * @typedef {Object} com.beco.geoshapes.GeoShapesList.$Properties\n * @property {Array.<com.beco.geoshapes.GeoShapes.$Properties>|null} [shapes] GeoShapesList shapes\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n\n /**\n * Properties of a GeoShapesList.\n * @memberof com.beco.geoshapes\n * @interface IGeoShapesList\n * @augments com.beco.geoshapes.GeoShapesList.$Properties\n * @deprecated Use com.beco.geoshapes.GeoShapesList.$Properties instead.\n */\n\n /**\n * Shape of a GeoShapesList.\n * @typedef {com.beco.geoshapes.GeoShapesList.$Properties} com.beco.geoshapes.GeoShapesList.$Shape\n */\n\n /**\n * Constructs a new GeoShapesList.\n * @memberof com.beco.geoshapes\n * @classdesc Represents a GeoShapesList.\n * @constructor\n * @param {com.beco.geoshapes.GeoShapesList.$Properties=} [properties] Properties to set\n * @property {Array.<Uint8Array>} [$unknowns] Unknown fields preserved while decoding when enabled\n */\n const GeoShapesList = function (properties) {\n this.shapes = [];\n if (properties)\n for (let keys = $Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null && keys[i] !== \"__proto__\")\n this[keys[i]] = properties[keys[i]];\n };\n\n /**\n * GeoShapesList shapes.\n * @member {Array.<com.beco.geoshapes.GeoShapes.$Properties>} shapes\n * @memberof com.beco.geoshapes.GeoShapesList\n * @instance\n */\n GeoShapesList.prototype.shapes = $util.emptyArray;\n\n /**\n * Creates a new GeoShapesList instance using the specified properties.\n * @function create\n * @memberof com.beco.geoshapes.GeoShapesList\n * @static\n * @param {com.beco.geoshapes.GeoShapesList.$Properties=} [properties] Properties to set\n * @returns {com.beco.geoshapes.GeoShapesList} GeoShapesList instance\n * @type {{\n * (properties: com.beco.geoshapes.GeoShapesList.$Shape): com.beco.geoshapes.GeoShapesList & com.beco.geoshapes.GeoShapesList.$Shape;\n * (properties?: com.beco.geoshapes.GeoShapesList.$Properties): com.beco.geoshapes.GeoShapesList;\n * }}\n */\n GeoShapesList.create = function(properties) {\n return new GeoShapesList(properties);\n };\n\n /**\n * Encodes the specified GeoShapesList message. Does not implicitly {@link com.beco.geoshapes.GeoShapesList.verify|verify} messages.\n * @function encode\n * @memberof com.beco.geoshapes.GeoShapesList\n * @static\n * @param {com.beco.geoshapes.GeoShapesList.$Properties} message GeoShapesList message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n GeoShapesList.encode = function (message, writer, _depth) {\n if (!writer)\n writer = $Writer.create();\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $util.recursionLimit)\n throw $Error(\"max depth exceeded\");\n if (message.shapes != null && message.shapes.length)\n for (let i = 0; i < message.shapes.length; ++i)\n $root.com.beco.geoshapes.GeoShapes.encode(message.shapes[i], writer.uint32(/* id 1, wireType 2 =*/10).fork(), _depth + 1).ldelim();\n if (message.$unknowns != null && $Object.hasOwnProperty.call(message, \"$unknowns\"))\n for (let i = 0; i < message.$unknowns.length; ++i)\n writer.raw(message.$unknowns[i]);\n return writer;\n };\n\n /**\n * Decodes a GeoShapesList message from the specified reader or buffer.\n * @function decode\n * @memberof com.beco.geoshapes.GeoShapesList\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {com.beco.geoshapes.GeoShapesList & com.beco.geoshapes.GeoShapesList.$Shape} GeoShapesList\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n GeoShapesList.decode = function (reader, length, _end, _depth, _target) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n if (_depth === $undefined)\n _depth = 0;\n if (_depth > $Reader.recursionLimit)\n throw $Error(\"max depth exceeded\");\n let end = length === $undefined ? reader.len : reader.pos + length, message = _target || new $root.com.beco.geoshapes.GeoShapesList();\n while (reader.pos < end) {\n let start = reader.pos;\n let tag = reader.tag();\n if (tag === _end) {\n _end = $undefined;\n break;\n }\n let wireType = tag & 7;\n switch (tag >>>= 3) {\n case 1: {\n if (wireType !== 2)\n break;\n if (!(message.shapes && message.shapes.length))\n message.shapes = [];\n message.shapes.push($root.com.beco.geoshapes.GeoShapes.decode(reader, reader.uint32(), $undefined, _depth + 1));\n continue;\n }\n }\n reader.skipType(wireType, _depth, tag);\n if (!reader.discardUnknown) {\n $util.makeProp(message, \"$unknowns\", false);\n (message.$unknowns || (message.$unknowns = [])).push(reader.raw(start, reader.pos));\n }\n }\n if (_end !== $undefined)\n throw $Error(\"missing end group\");\n return message;\n };\n\n /**\n * Gets the type url for GeoShapesList\n * @function getTypeUrl\n * @memberof com.beco.geoshapes.GeoShapesList\n * @static\n * @param {string} [prefix] Custom type url prefix, defaults to `\"type.googleapis.com\"`\n * @returns {string} The type url\n */\n GeoShapesList.getTypeUrl = function(prefix) {\n if (prefix === $undefined)\n prefix = \"type.googleapis.com\";\n return prefix + \"/com.beco.geoshapes.GeoShapesList\";\n };\n\n return GeoShapesList;\n })();\n\n return geoshapes;\n })();\n\n return beco;\n })();\n\n return com;\n})();\n\nexport {\n $root as default\n};\n","/**\r\n * Minimal fetch client: 15s per-request timeout, retry ×2 with exponential\r\n * backoff + jitter on network errors and 5xx (never 4xx), and composition\r\n * with the instance-level abort signal (destroy() cancels in-flight work).\r\n */\r\n\r\nconst REQUEST_TIMEOUT_MS = 15_000;\r\nconst MAX_RETRIES = 2;\r\n\r\nexport interface HttpOptions {\r\n headers?: Record<string, string>;\r\n method?: 'GET' | 'POST';\r\n body?: unknown;\r\n signal?: AbortSignal;\r\n}\r\n\r\nexport class HttpError extends Error {\r\n readonly status: number;\r\n constructor(status: number, url: string) {\r\n super(`becomap: HTTP ${String(status)} for ${url}`);\r\n this.status = status;\r\n }\r\n}\r\n\r\nfunction composeSignal(caller?: AbortSignal): AbortSignal {\r\n const timeout = AbortSignal.timeout(REQUEST_TIMEOUT_MS);\r\n return caller ? AbortSignal.any([caller, timeout]) : timeout;\r\n}\r\n\r\nasync function backoff(attempt: number): Promise<void> {\r\n const base = 300 * 2 ** attempt;\r\n const jitter = Math.random() * 200;\r\n await new Promise((resolve) => setTimeout(resolve, base + jitter));\r\n}\r\n\r\nasync function request(url: string, options: HttpOptions): Promise<Response> {\r\n let lastError: unknown;\r\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\r\n if (options.signal?.aborted) {\r\n throw lastError instanceof Error ? lastError : new DOMException('aborted', 'AbortError');\r\n }\r\n try {\r\n const response = await fetch(url, {\r\n method: options.method ?? 'GET',\r\n headers: {\r\n ...(options.body !== undefined ? { 'Content-Type': 'application/json' } : {}),\r\n ...options.headers,\r\n },\r\n ...(options.body !== undefined ? { body: JSON.stringify(options.body) } : {}),\r\n signal: composeSignal(options.signal),\r\n });\r\n if (response.status >= 500) {\r\n lastError = new HttpError(response.status, url);\r\n await backoff(attempt);\r\n continue;\r\n }\r\n if (!response.ok) throw new HttpError(response.status, url);\r\n return response;\r\n } catch (err) {\r\n if (err instanceof HttpError) throw err; // 4xx — never retried\r\n if (options.signal?.aborted) throw err; // caller cancelled — stop\r\n lastError = err; // network / timeout — retry\r\n if (attempt < MAX_RETRIES) await backoff(attempt);\r\n }\r\n }\r\n throw lastError instanceof Error ? lastError : new Error('becomap: request failed');\r\n}\r\n\r\nexport async function fetchJson<T>(url: string, options: HttpOptions = {}): Promise<T> {\r\n const response = await request(url, options);\r\n return (await response.json()) as T;\r\n}\r\n\r\nexport async function fetchBinary(url: string, options: HttpOptions = {}): Promise<Uint8Array> {\r\n const response = await request(url, options);\r\n return new Uint8Array(await response.arrayBuffer());\r\n}\r\n","import { com } from './gen/becomap-proto.js';\r\nimport { fetchBinary, fetchJson } from './http.js';\r\nimport type { VenueProvider } from './provider.js';\r\nimport type {\r\n FloorConnectionKind,\r\n LineStringGeometry,\r\n PolygonGeometry,\r\n ShapeGeometryData,\r\n RawBuilding,\r\n RawCategory,\r\n RawFloorConnection,\r\n RawLocation,\r\n RawMapObject,\r\n RawNode,\r\n RawShape,\r\n ShapeStyle,\r\n VenueData,\r\n} from './types.js';\r\n\r\n// ---------------------------------------------------------------------------\r\n// REST response contracts (extracted from v1 source — see 02-RESEARCH.md)\r\n// ---------------------------------------------------------------------------\r\n\r\ninterface AuthResponse {\r\n accessToken: string;\r\n}\r\n\r\ninterface SiteResponse {\r\n siteId: string;\r\n siteName: string;\r\n latitude: number;\r\n longitude: number;\r\n buildings: { buildingId: string; buildingName: string }[];\r\n binaryUrl: {\r\n route: string;\r\n shape: string;\r\n location: string;\r\n category: string;\r\n map_object: string;\r\n };\r\n}\r\n\r\ninterface FloorResponse {\r\n floorId: string;\r\n name: string;\r\n elevation: number;\r\n}\r\n\r\ninterface ConnectionResponse {\r\n connectionId: string;\r\n weight: number;\r\n multiplier: number;\r\n name: string;\r\n type: string;\r\n accessible: boolean;\r\n node: string[];\r\n direction: string;\r\n}\r\n\r\nexport interface RestVenueProviderOptions {\r\n baseUrl: string;\r\n siteId: string;\r\n clientId: string;\r\n clientSecret: string;\r\n}\r\n\r\nconst CONNECTION_KIND: Record<string, FloorConnectionKind> = {\r\n ELEVATOR: 'elevator',\r\n ESCALATOR: 'escalator',\r\n STAIRS: 'stairs',\r\n PASSAGE: 'passage',\r\n DOOR: 'door',\r\n RAMP: 'ramp',\r\n};\r\n\r\ninterface EditorShapeProperties {\r\n height?: number;\r\n color?: string;\r\n fillColor?: string;\r\n opacity?: number;\r\n label?: { fontSize?: number; nextRotation?: number; labelColor?: string };\r\n}\r\n\r\nfunction parseShapeFeature(\r\n jsonData: string,\r\n): { geometry: ShapeGeometryData; style: ShapeStyle } | null {\r\n try {\r\n const parsed = JSON.parse(jsonData) as {\r\n type?: string;\r\n geometry?: { type?: string; coordinates?: unknown };\r\n properties?: { shapeProperties?: EditorShapeProperties };\r\n coordinates?: unknown;\r\n };\r\n // editor emits a GeoJSON Feature; tolerate bare geometry too\r\n const geometry = parsed.type === 'Feature' ? parsed.geometry : parsed;\r\n let geometryData: ShapeGeometryData | null = null;\r\n if (geometry?.type === 'Polygon' && Array.isArray(geometry.coordinates)) {\r\n geometryData = {\r\n type: 'Polygon',\r\n coordinates: geometry.coordinates as PolygonGeometry['coordinates'],\r\n };\r\n } else if (geometry?.type === 'LineString' && Array.isArray(geometry.coordinates)) {\r\n // INNER_WALL shapes are centerlines, buffered into wall bands at render\r\n geometryData = {\r\n type: 'LineString',\r\n coordinates: geometry.coordinates as LineStringGeometry['coordinates'],\r\n };\r\n }\r\n if (!geometryData) return null;\r\n const props = parsed.type === 'Feature' ? parsed.properties?.shapeProperties : undefined;\r\n const style: ShapeStyle = {};\r\n if (typeof props?.height === 'number') style.height = props.height;\r\n if (typeof props?.color === 'string') style.color = props.color;\r\n if (typeof props?.fillColor === 'string') style.fillColor = props.fillColor;\r\n if (typeof props?.opacity === 'number') style.opacity = props.opacity;\r\n if (typeof props?.label?.fontSize === 'number') style.labelSize = props.label.fontSize;\r\n if (typeof props?.label?.nextRotation === 'number') style.labelRotation = props.label.nextRotation;\r\n return { geometry: geometryData, style };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Loads a venue from the beCoMap backend: token auth, site + floors + floor\r\n * connections via JSON, and the five editor-generated protobuf binaries via\r\n * the absolute URLs the site payload provides. Produces the same `VenueData`\r\n * contract as the mock provider.\r\n */\r\nexport class RestVenueProvider implements VenueProvider {\r\n #options: RestVenueProviderOptions;\r\n\r\n constructor(options: RestVenueProviderOptions) {\r\n this.#options = options;\r\n }\r\n\r\n async fetchVenue(signal?: AbortSignal): Promise<VenueData> {\r\n const { baseUrl, siteId, clientId, clientSecret } = this.#options;\r\n const httpOptions = signal ? { signal } : {};\r\n\r\n // 1. auth\r\n const auth = await fetchJson<AuthResponse>(`${baseUrl}/api/v1/auth/sdk/generate-token`, {\r\n method: 'POST',\r\n body: { clientId, clientSecret },\r\n ...httpOptions,\r\n });\r\n const authed = {\r\n headers: { Authorization: `Bearer ${auth.accessToken}` },\r\n ...httpOptions,\r\n };\r\n\r\n // 2. site metadata (carries building list + binary asset URLs)\r\n const site = await fetchJson<SiteResponse>(`${baseUrl}/api/v1/sdk/site/${siteId}`, authed);\r\n\r\n // 3. floors per building + 4. binaries + connections, all parallel.\r\n // Binaries are public CDN assets: sending the Authorization header\r\n // triggers a CORS preflight the CDN rejects (verified live) — fetch them\r\n // plain.\r\n const [floorLists, routeBin, shapeBin, locationBin, categoryBin, mapObjectBin, connections, iconset] =\r\n await Promise.all([\r\n Promise.all(\r\n site.buildings.map((b) =>\r\n fetchJson<FloorResponse[]>(`${baseUrl}/api/v1/sdk/floor/${siteId}/${b.buildingId}`, authed),\r\n ),\r\n ),\r\n fetchBinary(site.binaryUrl.route, httpOptions),\r\n fetchBinary(site.binaryUrl.shape, httpOptions),\r\n fetchBinary(site.binaryUrl.location, httpOptions),\r\n fetchBinary(site.binaryUrl.category, httpOptions),\r\n fetchBinary(site.binaryUrl.map_object, httpOptions),\r\n fetchJson<ConnectionResponse[]>(`${baseUrl}/api/v1/sdk/connection/${siteId}`, authed),\r\n // default icon set (key -> SVG url): category + amenity marker icons.\r\n // Optional — a failure must not sink the whole venue load.\r\n fetchJson<Record<string, string>>(`${baseUrl}/api/v1/category/get-icons`, authed).catch(\r\n (): Record<string, string> => ({}),\r\n ),\r\n ]);\r\n\r\n // 5. decode + map to the raw contract\r\n const buildings: RawBuilding[] = site.buildings.map((b, i) => ({\r\n id: b.buildingId,\r\n name: b.buildingName,\r\n floors: (floorLists[i] ?? []).map((f) => ({\r\n id: f.floorId,\r\n name: f.name,\r\n level: f.elevation,\r\n buildingId: b.buildingId,\r\n })),\r\n }));\r\n\r\n const nodes: RawNode[] = com.beco.node.NodeList.decode(routeBin).nodes.map((n) => ({\r\n id: n.nodeId ?? '',\r\n lat: n.lat ?? 0,\r\n lng: n.lng ?? 0,\r\n floorId: n.floorId ?? '',\r\n // v1 treats every node as accessible (`accessible || true`); editor data\r\n // was authored under that behavior, so v2 matches it deliberately.\r\n accessible: true,\r\n privateNode: n.privateNode ?? false,\r\n siblings: [...(n.siblings ?? [])],\r\n }));\r\n\r\n const shapes: RawShape[] = [];\r\n for (const s of com.beco.geoshapes.GeoShapesList.decode(shapeBin).shapes) {\r\n const parsed = parseShapeFeature(s.jsonData ?? '');\r\n if (!parsed) continue; // skip-and-collect: unparseable geometry\r\n shapes.push({\r\n id: s.shapeId ?? '',\r\n floorId: s.floorId ?? '',\r\n layerId: s.layerId ?? '',\r\n type: s.type ?? '',\r\n geometry: parsed.geometry,\r\n style: parsed.style,\r\n });\r\n }\r\n\r\n const locations: RawLocation[] = com.beco.location.LocationList.decode(locationBin).locations.map(\r\n (l) => {\r\n const loc: RawLocation = {\r\n id: l.locationId ?? '',\r\n name: l.name ?? '',\r\n type: l.type ?? '',\r\n categoryIds: [...(l.categories ?? [])],\r\n hidden: l.hidden ?? false,\r\n sortOrder: l.sortOrder ?? 0,\r\n };\r\n if (l.description) loc.description = l.description;\r\n if (l.nodeId) loc.nodeId = l.nodeId;\r\n if (l.polygonId) loc.shapeId = l.polygonId;\r\n if (l.amenity) loc.amenity = l.amenity;\r\n if (l.logo) loc.logoUrl = l.logo;\r\n return loc;\r\n },\r\n );\r\n\r\n const categories: RawCategory[] = com.beco.category.CategoryList.decode(categoryBin).categories.map(\r\n (c) => {\r\n const cat: RawCategory = { id: c.categoryId ?? '', name: c.name ?? '', sortOrder: c.sortOrder ?? 0 };\r\n // resolve the default-list KEY to its real CDN url via the iconset\r\n if (c.iconFromDefaultList) {\r\n const url = iconset[c.iconFromDefaultList];\r\n if (url) cat.icon = url;\r\n }\r\n if (c.color?.hex) cat.colorHex = c.color.hex;\r\n return cat;\r\n },\r\n );\r\n\r\n const mapObjects: RawMapObject[] = com.beco.map_object.MapObjectsList.decode(\r\n mapObjectBin,\r\n ).mapObjects.map((m) => ({\r\n id: m.id ?? '',\r\n nodeId: m.nodeId ?? '',\r\n modelUrl: m.mapObjectPath ?? '',\r\n scale: m.scale ?? 1,\r\n rotation: m.rotation ?? 0,\r\n altitude: m.altitude ?? 0,\r\n light: m.light ?? 1,\r\n }));\r\n\r\n const floorConnections: RawFloorConnection[] = [];\r\n for (const c of connections) {\r\n const [startNodeId, endNodeId] = c.node;\r\n if (!startNodeId || !endNodeId) continue;\r\n floorConnections.push({\r\n id: c.connectionId,\r\n kind: CONNECTION_KIND[c.type] ?? 'other',\r\n name: c.name,\r\n accessible: c.accessible,\r\n weight: c.weight,\r\n multiplier: c.multiplier,\r\n direction:\r\n c.direction === 'START_TO_END' ? 'startToEnd' : c.direction === 'END_TO_START' ? 'endToStart' : 'both',\r\n startNodeId,\r\n endNodeId,\r\n });\r\n }\r\n\r\n return {\r\n site: { id: site.siteId, name: site.siteName, center: [site.longitude, site.latitude] },\r\n buildings,\r\n nodes,\r\n shapes,\r\n locations,\r\n categories,\r\n iconset,\r\n mapObjects,\r\n floorConnections,\r\n };\r\n }\r\n}\r\n"],"mappings":"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,CAAC,EAAEH,EAAEG,CAAC,CAAC,CAAC,CAAE,EAAEP,EAAE,IAAI,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,I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","names":["require_maplibre_gl","__commonJSMin","exports","module","require_three","__commonJSMin","exports","module","require_aspromise","__commonJSMin","exports","module","asPromise","fn","ctx","params","offset","index","pending","resolve","reject","err","require_base64","__commonJSMin","exports","base64","string","p","b64","s64","i","buffer","start","end","parts","chunk","j","t","b","invalidEncoding","offset","c","base64Re","base64UrlRe","base64UrlNoPaddingRe","require_eventemitter","__commonJSMin","exports","module","EventEmitter","evt","fn","ctx","listeners","i","args","require_float","__commonJSMin","exports","module","factory","f32","f8b","le","writeFloat_f32_cpy","val","buf","pos","writeFloat_f32_rev","readFloat_f32_cpy","readFloat_f32_rev","writeFloat_ieee754","writeUint","sign","exponent","mantissa","writeUintLE","writeUintBE","readFloat_ieee754","readUint","uint","readUintLE","readUintBE","f64","writeDouble_f64_cpy","writeDouble_f64_rev","readDouble_f64_cpy","readDouble_f64_rev","writeDouble_ieee754","off0","off1","readDouble_ieee754","lo","hi","require_utf8","__commonJSMin","exports","utf8","replacementChar","looseDecoder","strictDecoder","TEXT_DECODER_MIN_LENGTH","string","len","c","i","utf8_read_js","buffer","start","end","str","t","c2","c3","t2","utf8_read_decoder","decoder","source","c1","c4","c5","c6","c7","c8","offset","require_pool","__commonJSMin","exports","module","pool","alloc","slice","size","SIZE","MAX","slab","offset","buf","require_longbits","__commonJSMin","exports","module","LongBits","Long","lo","hi","zero","zeroHash","value","sign","unsigned","charCodeAt","hash","mask","part0","part1","part2","Long_","require_umd","__commonJSMin","exports","module","global","factory","preferDefault","_exports","wasm","Long","low","high","unsigned","isLong","obj","ctz32","value","c","INT_CACHE","UINT_CACHE","fromInt","cachedObj","cache","fromBits","fromNumber","UZERO","ZERO","TWO_PWR_64_DBL","MAX_UNSIGNED_VALUE","TWO_PWR_63_DBL","MIN_VALUE","MAX_VALUE","TWO_PWR_32_DBL","lowBits","highBits","pow_dbl","fromString","str","radix","p","radixToPower","result","i","size","power","fromValue","val","TWO_PWR_16_DBL","TWO_PWR_24_DBL","TWO_PWR_24","ONE","UONE","NEG_ONE","LongPrototype","radixLong","div","rem1","rem","remDiv","intval","digits","bit","top11Bits","other","thisNeg","otherNeg","addend","a48","a32","a16","a00","b48","b32","b16","b00","c48","c32","c16","c00","subtrahend","multiplier","divisor","approx","res","halfThis","log2","delta","approxRes","approxRem","numBits","b","le","hi","lo","bytes","lowBigInt","highBigInt","_default","require_minimal","__commonJSMin","exports","util","isUnsafeProperty","key","value","obj","prop","Buffer","sizeOrArray","id","wireType","data","out","tag","Long","hash","unsigned","bits","merge","dst","ifNotSet","limit","a","src","keys","enumerable","str","newError","name","CustomError","message","properties","fieldNames","fieldMap","i","require_writer","__commonJSMin","exports","module","Writer","util","BufferWriter","LongBits","base64","utf8","create","size","sizeVarint32","value","n","need","buf","writeStringAscii","val","pos","i","writeVarint32","writeVarint64","lo","hi","bits","writeFixed32","len","lenPos","p","VIEW_THRESHOLD_FLOAT","VIEW_THRESHOLD_INT","getLazyView","writer","count","threshold","view","bytes","dv","states","vlen","shared","offset","BufferWriter_","require_writer_buffer","__commonJSMin","exports","module","BufferWriter","Writer","util","writeStringBuffer","val","buf","pos","value","len","n","require_reader","__commonJSMin","exports","module","Reader","util","BufferReader","LongBits","utf8","indexOutOfRange","reader","writeLength","buffer","create_array","create","start","end","buf","pos","value","i","readLongVarint","bits","b","readFixed32_end","readFixed64","array","VIEW_THRESHOLD_FLOAT","VIEW_THRESHOLD_INT","getLazyView","count","threshold","view","len","dv","k","j","length","wireType","depth","fieldNumber","tag","nestedField","BufferReader_","fn","require_reader_buffer","__commonJSMin","exports","module","BufferReader","Reader","util","buffer","start","end","len","require_service","__commonJSMin","exports","module","Service","util","rpcImpl","requestDelimited","responseDelimited","rpcCall","method","requestCtor","responseCtor","request","callback","self","err","response","endedByRPC","require_rpc","__commonJSMin","exports","rpc","require_roots","__commonJSMin","exports","module","require_index_minimal","__commonJSMin","exports","configure","require_minimal","__commonJSMin","exports","module","src_exports","__export","MockVenueProvider","RestVenueProvider","Venue","buildVenue","createMap","import_maplibre_gl","_listeners","Emitter","__privateAdd","event","listener","set","__privateGet","payload","assertContainer","container","THREE","import_maplibre_gl","createFrame","center","toMeters","frame","lngLat","toLngLat","x","y","ringToMeters","ring","pts","p","first","last","polygonCentroid","a","cx","cy","i","p0","p1","cross","pointInRing","lng","lat","inside","j","pi","pj","xi","yi","xj","yj","THREE","import_three","mergeGeometries","geometries","useGroups","isIndexed","attributesUsed","morphAttributesUsed","attributes","morphAttributes","morphTargetsRelative","mergedGeometry","offset","i","geometry","attributesCount","name","count","indexOffset","mergedIndex","index","j","mergedAttribute","mergeAttributes","numMorphTargets","morphAttributesToMerge","mergedMorphAttribute","TypedArray","itemSize","normalized","gpuType","arrayLength","attribute","array","result","tupleOffset","l","c","value","toTrianglesDrawMode","geometry","drawMode","index","indices","position","i","numberOfTriangles","newIndices","newGeometry","SLAB_HEIGHT","STORE_HEIGHT_MIN","STORE_HEIGHT_RANGE","WINDOW_SPACING_M","FALLBACK_PALETTE","SLAB_TOP","hashId","id","h","i","storeHeight","roofColorFor","location","shapeId","hex","addOutlineWalls","buf","outline","z0","z1","u","p0","p1","len","nx","ny","base","u1","wallBuffersToGeometry","geo","shapeRole","shape","shapeHeight","role","polygonTopColor","WALL_BAND_HALF_WIDTH_M","lineBandGeometries","points","closed","half","color","out","count","a","b","dx","dy","ex","ey","ring","coloredSides","capWithHoles","DEFAULT_WALL_SIDE","LABEL_MIN_SIZE","LABEL_MAX_SIZE","CHAR_ADVANCE","CONTACT_SHADOW","CONTACT_SHADOW_SPREAD_M","WIDTH_FILL","HEIGHT_FILL","chordSpan","px","py","angle","ts","det","t","p","q","t0","t1","chordThrough","span","chordAround","ALONG_FILL","bestSplit","text","best","bestDiff","diff","fitAtAngle","name","cx","cy","cos","sin","minU","maxU","minV","maxV","v","along","across","fontSize","oneLine","split","l1","l2","maxChars","heightCap","twoLine","off","rowA","rowB","rowMin","HORIZONTAL_OK","normalizeTextAngle","labelFit","axisA","polygonLabelAngle","axisB","levelAxis","crossAxis","level","cross","LOGO_ALONG_FILL","LOGO_ACROSS_FILL","logoFitBox","alongM","acrossM","cAlong","cAcross","availW","availH","maxDistSq","distSq","shapeRings","frame","smoothRing","ringToMeters","r","rings","z","outer","x","y","hole","colors","SUN_X","SUN_Y","SIDE_AMBIENT","SIDE_DIFFUSE","sideShade","nrm","s","gradientSides","topColor","baseColor","c","ringArea","ringPerimeter","THIN_STRIP_M","FLAT_ZONE_GAP_M","pointInRing","inside","n","j","insetRing","offset","area","lx","ly","ux","uy","uxi","uyi","uxj","uyj","lxi","lyi","lxj","lyj","denom","ia","CURVE_SMOOTH_ITERATIONS","CURVE_KEEP_ANGLE_DEG","ringSelfIntersects","a1","a2","b1","b2","d","iterations","keepAngleDeg","cosKeep","pts","it","prev","cur","next","d1x","d1y","d2x","d2y","buildFloorGeometry","floor","theme","solid","glass","labelSpecs","borderPos","pushBorder","locationByShapeId","loc","style","bucket","height","antiCoplanar","toMeters","P","wallZ1","innerHex","location0","insetFlat","cx0","cy0","polygonCentroid","fit0","plateHex","wallHex","perim","dz","dividerCol","panelBucket","hEff","topZ","wallTopZ","upperCol","baseCol","edgeCol","lowerCol","blendTop","insetR","bevelCol","fit","unitBucket","borders","mergeGeometries","THREE","import_three","workerBootstrap","modules","registerModule","ref","callback","id","name","dependencies","init","getTransferables","dep","depResult","rehydrate","value","err","callModule","ref$1","args","result","handleResult","rej","tx","str","r","url","messageId","action","data","transferables","defineMainThreadModule","options","moduleFunc","len","initResult","initPromise","deps","supportsWorkers","supported","worker","_workerModuleId","_messageId","_allowInitAsString","workers","registeredModules","openRequests","defineWorkerModule","workerId","onMainThread","registrationPromise","stringifyFunction","callWorker","unregister","isCallable","terminateWorker","fn","getWorker","bootstrap","e","response","msgId","resolve","reject","SDFGenerator","exports","pointOnQuadraticBezier","x0","y0","x1","y1","x2","y2","t","pointOut","t2","pointOnCubicBezier","x3","y3","forEachPathCommand","pathString","commandCallback","segmentRE","match","firstX","firstY","prevX","prevY","args","v","pathToLineSegments","segmentCallback","curvePoints","tempPoint","command","startX","startY","endX","endY","ctrl1X","ctrl1Y","ctrl2X","ctrl2Y","prevCurveX","prevCurveY","i","prevCurveX$1","prevCurveY$1","i$1","viewportQuadVertex","copyTexFragment","cache","glContextParams","withWebGLContext","glOrCanvas","callback","gl","wrapper","getExtension","name","ext","extensions","compileShader","src","type","shader","withProgram","vert","frag","func","programs","attributes","uniforms","program","values","len","uniformLoc","size","usage","instancingDivisor","data","attr","isWebGL2","withTexture","textureUnit","texture","textures","withTextureFramebuffer","framebuffer","framebufferStack","handleContextLoss","e","renderImageData","imageData","x","y","width","height","channels","ref","tex","texUnit","setUniform","setAttribute","resizeWebGLCanvasWithoutClearing","canvas","newWidth","newHeight","webglUtils","generate$2","sdfWidth","sdfHeight","path","viewBox","maxDistance","sdfExponent","textureData","viewBoxWidth","viewBoxHeight","segments","a","b","sdfX","sdfY","signedDist","findNearestSignedDistance","alpha","closestDistSq","closestDist","seg","distSq","absSquareDistanceToLineSegment","isPointInPoly","winding","intersects","generateIntoCanvas$2","channel","generateIntoFramebuffer$1","rgbaData","lineX0","lineY0","lineX1","lineY1","ldx","ldy","lengthSq","dx","dy","javascript","mainVertex","mainFragment","postFragment","viewportUVs","implicitContext","isTestingSupport","NULL_OBJECT","supportByCanvas","validateSupport","isSupported","generate$1","generateIntoFramebuffer","j","generateIntoCanvas$1","lineSegmentCoords","intermediateTexture","intermediateTextureUnit","instancingExtension","blendMinMaxExtension","key","supported","failReason","expectedResult","testResult","val","err","webgl","generate","generateIntoCanvas","bidiFactory","bidi","exports","DATA","TYPES","TYPES_TO_NAMES","type","i","ISOLATE_INIT_TYPES","STRONG_TYPES","NEUTRAL_ISOLATE_TYPES","BN_LIKE_TYPES","TRAILING_TYPES","map","parseData","loop","lastCode","range","ref","skip","step","getBidiCharType","char","getBidiCharTypeName","data$1","parseCharacterMap","encodedString","includeReverse","radix","reverseMap","prevPair","visit","entry","a","b","openToClose","closeToOpen","canonical","parse$1","openingToClosingBracket","closingToOpeningBracket","getCanonicalBracket","TYPE_L","TYPE_R","TYPE_EN","TYPE_ES","TYPE_ET","TYPE_AN","TYPE_CS","TYPE_B","TYPE_S","TYPE_ON","TYPE_BN","TYPE_NSM","TYPE_AL","TYPE_LRO","TYPE_RLO","TYPE_LRE","TYPE_RLE","TYPE_PDF","TYPE_LRI","TYPE_RLI","TYPE_FSI","TYPE_PDI","getEmbeddingLevels","string","baseDirection","MAX_DEPTH","charTypes","charTypeCounts","changeCharType","oldType","embedLevels","isolationPairs","paragraphs","paragraph","i$1","determineAutoEmbedLevel","FORMATTING_TYPES","nextEven","n","nextOdd","paraIdx","statusStack","stackTop","overflowIsolateCount","overflowEmbeddingCount","validIsolateCount","i$2","charType","level","level$1","level$2","isolInitIndex","levelRuns","currentRun","i$3","charType$1","lvl","isIsolInit","isPDI","isolatingRunSeqs","runIdx","run","seqRuns","pdiIndex","i$4","seqIndices","i$5","run$1","j","firstLevel","prevLevel","i$6","lastIndex","lastLevel","nextLevel","i$7","seqIdx","seqIndices$1","sosType","eosType","embedDirection","si","i$8","prevType","sj","si$1","i$9","sj$1","prevCharType","si$2","i$10","si$3","i$11","prevType$1","nextType","sj$2","sj$3","si$4","i$12","sj$4","si$5","i$13","sj$5","sj$6","si$6","prevStrongType","i$14","R_TYPES_FOR_N_STEPS","STRONG_TYPES_FOR_N_STEPS","bracketPairs","openerStack","si$7","oppositeBracket","stackIdx","stackChar","pairIdx","ref$1","openSeqIdx","closeSeqIdx","foundStrongType","useStrongType","si$8","i$15","lr","si$9","i$16","lr$1","si$10","si$11","si$12","niRunStart","niRunEnd","prevType$2","si2","nextType$1","si2$1","sj$7","i$17","level$3","type$1","j$1","start","isFSI","pdi","indexOfMatchingPDI","isolateStart","isolationLevel","data","mirrorMap","parse","value","key","getMirroredCharacter","getMirroredCharactersMap","embeddingLevels","end","strLen","mirror","getReorderSegments","embeddingLevelsResult","segments","lineStart","lineEnd","lineLevels","maxLevel","minOddLevel","segStart","getReorderedString","embedLevelsResult","indices","getReorderedIndices","chars","charIndex","slice","bidi_default","import_three","voidMainRegExp","expandShaderIncludes","source","pattern","replace","match","include","chunk","_lut","i","generateUUID","d0","d1","d2","d3","assign","target","len","prop","epoch","CONSTRUCTOR_CACHE","SHADER_UPGRADE_CACHE","materialInstanceId","createDerivedMaterial","baseMaterial","options","optionsKey","getKeyForOptions","ctorsByDerivation","privateBeforeCompileProp","onBeforeCompile","shaderInfo","renderer","cacheKey","upgradedShaders","upgraded","upgradeShaders","DerivedMaterial","derive","base","derived","descriptor","value","testMaterial","fn","newBase","depthMaterial","distanceMaterial","_depthMaterial","_distanceMaterial","material","vertexShader","fragmentShader","key","vertexDefs","vertexMainIntro","vertexMainOutro","vertexTransform","fragmentDefs","fragmentMainIntro","fragmentMainOutro","fragmentColorTransform","customRewriter","timeUniform","res","postChunks","code","match1","index","fullStr","injectIntoShaderCode","shaderCode","id","defs","intro","outro","optionsJsonReplacer","_idCtr","optionsHashesToIds","optionsHash","typrFactory","r","e","t","a","n","o","s","i","h","d","f","u","l","v","c","p","U","g","S","m","b","y","P","x","F","C","_","I","w","k","G","O","T","D","B","A","R","L","W","M","V","E","woff2otfFactory","j","z","q","H","J","K","N","Q","X","Y","Z","$","rr","er","nr","tr","parserFactory","Typr","woff2otf","cmdArgLengths","joiningTypeRawData","JT_LEFT","JT_RIGHT","JT_DUAL","JT_TRANSPARENT","JT_JOIN_CAUSING","JT_NON_JOINING","joiningTypeMap","getCharJoiningType","ch","type","lastCode","range","skip","step","ISOL","INIT","FINA","MEDI","formsToFeatures","detectJoiningForms","str","joiningForms","prevJoiningType","prevForm","prevIndex","code","joiningType","form","stringToGlyphs","font","glyphIds","cc","gsub","lookupList","featureList","supportedFeatures","usedLookups","feature","ti","tab","isJoiningFeature","ci","calcGlyphPositions","positions","glyphIndex","glyphId","gpos","llist","lookup","applyValueRecord","adj","prevGlyphIndex","getPrevGlyphIndex","coverageIndex","right","c1","c2","markArrIndex","baseGlyphIndex","isBaseGlyph","baseArrIndex","markRecord","baseAnchor","mark1ArrIndex","prevGlyphId","getGlyphClass","mark2ArrIndex","mark1Record","mark2Anchor","ind1","ind2","filter","source","gi","classDef","firstNum","args","wrapFontObj","typrFont","glyphMap","os2","hhea","unitsPerEm","ascender","fontObj","text","fontSize","letterSpacing","callback","penX","fontScale","charIndex","glyphObj","cmds","crds","path","crdsIdx","len","numArgs","xMin","yMin","xMax","yMax","buffer","peek","tag","workerModule","defineWorkerModule","unicodeFontResolverClientFactory","createFontResolver","fontParser","unicodeFontResolverClient","parsedFonts","loadingFonts","doLoadFont","url","onError","err","request","loadFont","fontUrl","cb","lang","userFonts","style","weight","unicodeFontsURL","charResolutions","fontResolutions","allDone","fontIndices","fallbackRanges","def","prevCharResult","resolveUserFonts","startIndex","iLen","codePoint","jLen","src","unicodeRange","isCodeInRanges","fontIndex","resolveFallbacks","fallbackString","fontUrls","chars","fontIndexOffset","charIdx","endIdx","loadedCount","ranges","start","end","fontResolverWorkerModule","createTypesetter","resolveFonts","bidi","DEFAULT_IGNORABLE_CHARS","lineBreakingWhiteSpace","BREAK_AFTER_CHARS","calculateFontRuns","fonts","preResolvedFonts","onDone","onResolved","curRun","prevVal","runs","typeset","sdfGlyphSize","fontWeight","fontStyle","lineHeight","maxWidth","direction","textAlign","textIndent","whiteSpace","overflowWrap","anchorX","anchorY","metricsOnly","includeCaretPositions","chunkedBoundsSize","colorRanges","mainStart","now","timings","hasMaxWidth","glyphFontIndices","glyphPositions","glyphData","glyphColors","caretPositions","visibleBounds","chunkedBounds","maxLineWidth","renderableGlyphCount","canWrap","metricsByFont","typesetStart","lineXOffset","prevRunEndX","currentLine","TextLine","lines","run","descender","lineGap","capHeight","xHeight","fontData","fontSizeMult","calcLineHeight","halfLeading","caretHeight","caretTop","runText","prevGlyphX","prevGlyphObj","glyphX","glyphY","char","glyphWidth","curLineCount","nextLine","adjustX","fly","totalHeight","line","isTrailingWhitespace","glyphInfo","baseline","baselineDiff","anchorXOffset","anchorYOffset","parsePercent","bidiLevelsResult","renderableGlyphIndex","prevCharIndex","colorCharIndex","chunk","currentColor","lineIndex","lineGlyphCount","lineWidth","trailingWhitespaceCount","justifyAdjust","whitespaceCount","justifyOffset","flips","fi","left","startInLine","endInLine","info","setGlyphObj","rtl","mirrored","caretLeft","caretRight","ligCount","fillLigatureCaretPositions","idx","fontSrc","fontGlyphData","visX0","visY0","visX1","visY1","chunkRect","index","measure","result","x0","y0","x1","y1","match","pct","ligStartIndex","ligStartX","ligEndX","ligBottom","ligTop","guessedAdvanceX","textLineProps","newLine","obj","prop","all","val","mainThreadGenerator","SDFGenerator","warned","generateSDF","width","height","viewBox","distance","exponent","canvas","channel","useWebGL","generateSDF_GL","generateSDF_JS_Worker","queue","chunkTimeBudget","timer","nextChunk","resolve","reject","threadCount","idleTimeout","threads","callNum","workerId","thread","_createSDFGenerator","generate","textureData","timing","imageData","terminateWorker","warmUpSDFCanvas","resizeWebGLCanvasWithoutClearing","CONFIG","tempColor","hasRequested","now$1","atlases","getTextRenderInfo","args","callback","hasRequested","assign","totalStart","now$1","defaultFontURL","CONFIG","fonts","toAbsoluteURL","colors","key","val","tempColor","textureWidth","sdfExponent","sdfGlyphSize","glyphsPerRow","atlas","canvas","initContextLossHandling","sdfTexture","sdfCanvas","typesetInWorker","typesetOnMainThread","result","glyphIds","glyphFontIndices","fontData","glyphPositions","fontSize","timings","neededSDFs","glyphBounds","boundsIdx","positionsIdx","quadsStart","fontGlyphMaps","font","map","glyphId","i","fontIndex","fontSrc","unitsPerEm","glyphInfo","path","pathBounds","fontUnitsMargin","atlasIndex","sdfViewBox","posX","posY","fontSizeMult","sdfStart","currentHeight","neededRows","neededHeight","resizeWebGLCanvasWithoutClearing","generateGlyphSDF","timing","safariPre15Workaround","warmUpSDFCanvas","contextLost","useGPU","maxDist","squareIndex","x","y","channel","generateSDF","event","promises","glyphMap","glyph","assign","toObj","fromObj","key","linkEl","toAbsoluteURL","path","safariPre15Workaround","atlas","sdfCanvas","sdfTexture","width","height","gl","pixels","typesetterWorkerModule","defineWorkerModule","createTypesetter","fontResolverWorkerModule","bidi_default","fontResolver","bidiFactory","typesetInWorker","typesetter","args","resolve","result","transferables","p","typesetOnMainThread","templateGeometries","getTemplateGeometry","detail","geom","glyphBoundsAttrName","glyphIndexAttrName","glyphColorAttrName","GlyphsGeometry","tpl","attr","r","glyphBounds","glyphAtlasIndices","blockBounds","chunkedBounds","glyphColors","bounds","curveRadius","bbox","PI","floor","min","max","sin","cos","halfPi","twoPi","absR","leftAngle","rightAngle","minX","maxX","maxZ","clipRect","count","chunks","i","rect","attrName","newArray","itemSize","VERTEX_DEFS","VERTEX_TRANSFORM","FRAGMENT_DEFS","FRAGMENT_TRANSFORM","createTextDerivedMaterial","baseMaterial","textMaterial","createDerivedMaterial","vertexShader","fragmentShader","uDiffuseRE","voidMainRegExp","defaultMaterial","defaultStrokeColor","tempMat4","tempVec3a","tempVec3b","tempArray","origin","defaultOrient","first","o","getFlatRaycastMesh","mesh","getCurvedRaycastMesh","syncStartEvent","syncCompleteEvent","SYNCABLE_PROPS","COPYABLE_PROPS","Text","geometry","callback","getTextRenderInfo","textRenderInfo","queued","fn","renderer","scene","camera","material","group","derivedMaterial","onDispose","outlineMaterial","m","isOutline","uniforms","textInfo","sdfTexture","distanceOffset","blurRadius","strokeWidth","fillOpacity","strokeOpacity","strokeColor","offsetX","offsetY","outlineWidth","outlineOffsetX","outlineOffsetY","outlineBlur","outlineOpacity","pad","color","colorObj","orient","rotMat","match","hSign","hAxis","vSign","vAxis","value","pct","position","target","raycaster","intersects","raycastMesh","uv","x","y","z","source","prop","privateKey","syncStartEvent$1","syncCompleteEvent$1","memberIndexAttrName","floatsPerMember","tempBox3","tempColor$1","BatchedText","_BatchedText","e","objects","text","createBatchedTextMaterial","force","_","member","texture","dataLength","width","texData","setTexData","index","dirty","startIndex","matrix","uTroikaTotalBounds","uTroikaClipRect","uTroikaPositionOffset","uTroikaEdgeOffset","uTroikaBlurRadius","uTroikaStrokeWidth","uTroikaStrokeColor","uTroikaStrokeOpacity","uTroikaFillOpacity","uTroikaCurveRadius","syncPromises","packingInfo","resolve","batchedAttributes","memberIndexes","batchedGlyphIndexes","batchedGlyphBounds","totalGlyphCount","cloneAndResize","memberIndex","glyphIndex","glyphCount","tex","newLength","copy","texUniformName","texSizeUniformName","batchMaterial","shaders","uniformName","uniformToVarying","varyingName","uniformRE","type","hadFragmentUniform","$0","$1","hadVertexUniform","styleLabel","t","color","createSingleLabel","spec","onReady","Text","base","flipped","placeLogo","e","extra","rot","ux","uy","createFloorLabels","specs","batched","BatchedText","members","group","logos","loader","availW","availH","off","mat","mesh","entry","tex","img","aspect","h","text","m","labelFlipState","bearingDeg","currentlyFlipped","b","THREE","THIN_STRIP_M","ringThickness","ring","area","perim","i","p","q","levelAxis","a","polygonLabelAngle","b","MARKER_DIAMETER_M","FLOAT_DIAMETER_M","FLOAT_HEIGHT_M","BADGE_FILL","GLYPH_INK","isConnection","amenity","glyphFor","drawSteps","ctx","textureCache","badgeTexture","glyph","cached","c","tex","iconTextureCache","iconBadgeTexture","iconUrl","fill","fallback","onLoad","key","drawCircle","img","glyphCanvas","createAmenityMarkers","frame","floor","iconset","onIconLoad","nodesById","n","shapesById","s","group","entries","floating","geo","floatGeo","loc","x","y","z","SLAB_HEIGHT","base","shape","toMeters","polygonCentroid","role","shapeRole","renderedH","shapeHeight","node","category","mat","badge","mesh","flipped","extra","e","bearingDeg","pitchDeg","rx","rz","THREE","import_three","GLTFLoader","manager","parser","GLTFMaterialsClearcoatExtension","GLTFMaterialsDispersionExtension","GLTFTextureBasisUExtension","GLTFTextureWebPExtension","GLTFTextureAVIFExtension","GLTFMaterialsSheenExtension","GLTFMaterialsTransmissionExtension","GLTFMaterialsVolumeExtension","GLTFMaterialsIorExtension","GLTFMaterialsEmissiveStrengthExtension","GLTFMaterialsSpecularExtension","GLTFMaterialsIridescenceExtension","GLTFMaterialsAnisotropyExtension","GLTFMaterialsBumpExtension","GLTFLightsExtension","GLTFMeshoptCompression","GLTFMeshGpuInstancing","url","onLoad","onProgress","onError","scope","resourcePath","relativeUrl","_onError","e","loader","data","gltf","dracoLoader","ktx2Loader","meshoptDecoder","callback","path","json","extensions","plugins","textDecoder","BINARY_EXTENSION_HEADER_MAGIC","EXTENSIONS","GLTFBinaryExtension","error","GLTFParser","i","plugin","extensionName","extensionsRequired","GLTFMaterialsUnlitExtension","GLTFDracoMeshCompressionExtension","GLTFTextureTransformExtension","GLTFMeshQuantizationExtension","resolve","reject","GLTFRegistry","objects","key","object","nodeDefs","nodeIndex","nodeLength","nodeDef","lightIndex","cacheKey","dependency","lightDef","lightNode","color","range","assignExtrasToUserData","type","index","self","light","materialParams","materialDef","pending","metallicRoughness","array","materialIndex","emissiveStrength","extension","scale","colorFactor","colorArray","textureIndex","textureDef","name","source","handler","isSupported","image","bufferView","extensionDef","buffer","decoder","res","byteOffset","byteLength","count","stride","result","meshDef","primitive","WEBGL_CONSTANTS","attributesDef","attributes","accessor","results","nodeObject","meshes","instancedMeshes","mesh","m","p","q","s","instancedMesh","attributeName","attr","BINARY_EXTENSION_HEADER_LENGTH","BINARY_EXTENSION_CHUNK_TYPES","headerView","chunkContentsLength","chunkView","chunkIndex","chunkLength","chunkType","contentArray","bufferViewIndex","gltfAttributeMap","threeAttributeMap","attributeNormalizedMap","attributeTypeMap","threeAttributeName","ATTRIBUTES","accessorDef","componentType","WEBGL_COMPONENT_TYPES","geometry","attribute","normalized","texture","transform","GLTFCubicSplineInterpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","values","valueSize","offset","i1","t0","t","t1","stride2","stride3","td","pp","ppp","offset1","offset0","s2","s3","s0","s1","p0","m0","p1","m1","_q","GLTFCubicSplineQuaternionInterpolant","WEBGL_FILTERS","WEBGL_WRAPPINGS","WEBGL_TYPE_SIZES","PATH_PROPERTIES","INTERPOLATION","ALPHA_MODES","createDefaultMaterial","cache","addUnknownExtensionsToUserData","knownExtensions","objectDef","gltfDef","addMorphTargets","targets","hasMorphPosition","hasMorphNormal","hasMorphColor","il","target","pendingPositionAccessors","pendingNormalAccessors","pendingColorAccessors","pendingAccessor","accessors","morphPositions","morphNormals","morphColors","updateMorphTargets","targetNames","createPrimitiveKey","primitiveDef","geometryKey","dracoExtension","createAttributesKey","attributesKey","keys","getNormalizedComponentScale","constructor","getImageURIMimeType","uri","_identityMatrix","options","isSafari","safariVersion","isFirefox","firefoxVersion","userAgent","safariMatch","ext","dependencies","scene","skinDefs","meshDefs","skinIndex","skinLength","joints","ref","updateMappings","original","clone","mappings","child","func","defs","def","bufferIndex","bufferDef","bufferViewDef","accessorIndex","itemSize","TypedArray","pendingBufferViews","bufferViews","elementBytes","itemBytes","byteStride","bufferAttribute","ibSlice","ibCacheKey","ib","itemSizeIndices","TypedArrayIndices","byteOffsetIndices","byteOffsetValues","sparseIndices","sparseValues","sourceIndex","sourceDef","promise","sampler","URL","sourceURI","isObjectURL","blob","imageBitmap","mapName","mapDef","colorSpace","gltfReference","material","useDerivativeTangents","useVertexColors","useFlatShading","pointsMaterial","lineMaterial","cachedMaterial","materialType","materialExtensions","kmuExtension","alphaMode","emissiveFactor","originalName","sanitizedName","primitives","createDracoPrimitive","addPrimitiveAttributes","cached","geometryPromise","meshIndex","materials","geometries","toTrianglesDrawMode","group","cameraIndex","camera","cameraDef","params","skinDef","inverseBindMatrices","jointNodes","bones","boneInverses","jointNode","mat","animationIndex","animationDef","animationName","pendingNodes","pendingInputAccessors","pendingOutputAccessors","pendingSamplers","pendingTargets","channel","input","output","nodes","inputAccessors","outputAccessors","samplers","tracks","node","inputAccessor","outputAccessor","createdTracks","k","o","nodePending","childPending","childrenDef","skeletonPending","children","skeleton","nodeName","meshPromise","matrix","sceneIndex","sceneDef","nodeIds","reduceAssociations","reducedAssociations","value","targetName","TypedKeyframeTrack","interpolation","outputArray","j","jl","track","scaled","interpolantType","computeBounds","box","min","max","boxScale","maxDisplacement","vector","sphere","assignAttributeAccessor","gltfAttributeName","computeModelInstances","frame","venue","floorId","byUrl","dummy","def","node","x","y","toMeters","SLAB_HEIGHT","yaw","list","loadFloorModels","defs","loader","GLTFLoader","group","url","matrices","obj","mesh","instanced","m","i","err","THREE","WHITE","lighten","c","f","darken","fixed","hex","PANEL_SHAPE","panel","p","IVORY_PALETTE","IVORY","DATA","base","THEMES","resolvePolygonTheme","name","THREE","import_maplibre_gl","_root","_origin","_camera","_scene","_renderer","_originMatrix","_map","_stats","_lastMatrix","_hasMatrix","RenderLayer","root","origin","__privateAdd","_gl","matrix","__privateGet","__privateSet","map","gl","mc","maplibregl","scale","x","y","z","canvas","w","h","full","v","px","py","ndcX","ndcY","inv","a4","b4","dir","THREE","RIBBON_WIDTH","START_MARKER_URL","START_MARKER_PX","Z_INDOOR","SLAB_HEIGHT","Z_OUTDOOR","RIBBON_VERTEX","RIBBON_FRAGMENT","makeRibbonMaterial","ghost","_material","_ghostMaterial","_meshes","_runner","_startMarker","_startTex","_startAspect","_startView","_parent","_frame","_totalLength","_repaint","_RouteRibbon_instances","setUniform_fn","ensureStartMarker_fn","applyStartMarkerView_fn","ensureRunner_fn","RouteRibbon","parent","frame","repaint","__privateAdd","__privateSet","segments","offset","segment","localPts","ringToMeters","__privateGet","z","curve","x","y","length","n","pts","pos","uvs","idx","tan","acc","arcs","i","p","prev","next","nx","ny","a","geo","solid","first","start","marker","__privateMethod","isFloorVisible","entry","visible","meters","best","progressMeters","m","seconds","bearingDeg","pitchDeg","metersPerPixel","runner","b","a0","a1","t","obj","name","value","mat","img","w","canvas","tex","mesh","bearing","pitch","mpp","h","group","cone","tip","head","o","SHOW_MAP_OBJECT_MODELS","SHELL_STOREY_M","SHELL_ROOF_PALETTE","FLATTEN_SCALE","_venue","_frame","_map","_layer","_root","_floors","_shells","_capMat","_shellWallMat","_theme","_translucentMat","_borderMat","_highlightMat","_highlight","_hoverMat","_hover","_routeRibbon","_labelsFlipped","_onCameraMove","_onRotate","_floorScaleZ","_floorScaleTarget","_flattenRaf","_VenueRenderer_instances","refreshRouteVisibility_fn","ensureShell_fn","ensureFloor_fn","buildFloor_fn","VenueRenderer","map","venue","theme","__privateAdd","__privateSet","createFrame","resolvePolygonTheme","__privateGet","sun","RenderLayer","flip","labelFlipState","entry","shell","bearing","pitch","outlineLngLat","storeHeightM","obj","outline","ringToMeters","group","buf","z1","addOutlineWalls","walls","shape","x","y","cap","visible","RouteRibbon","flat","tick","diff","buildingId","view","building","__privateMethod","floor","floorId","wasVisible","e","id","name","z","px","py","options","bounds","maplibregl","any","pos","footprint","s","ring","height","roofColor","hashId","roof","count","colors","i","cx","cy","polygonCentroid","label","createSingleLabel","polygonLabelAngle","geo","buildFloorGeometry","createFloorLabels","createAmenityMarkers","loadFloorModels","models","_venue","_openZoom","_closeZoom","_zoom","_selected","_manualOpen","_focusedBuildingId","_lastViews","_FloorManager_instances","isOpen_fn","computeView_fn","diff_fn","FloorManager","venue","options","__privateAdd","__privateSet","b","ground","__privateGet","buildingId","__privateMethod","out","v","zoom","floorId","floor","view","changes","next","prev","createFloorSwitcher","container","onSelect","el","name","buttons","building","view","floor","btn","active","resolveClick","venue","viewOf","lng","lat","building","view","footprint","s","ring","pointInRing","floor","f","locationByShapeId","loc","shape","shapeRing","location","tokenize","text","_entries","_SearchIndex","venue","__privateAdd","location","__privateGet","c","queryTokens","results","i","resolve","entry","score","scoreEntry","a","b","categoryId","e","SearchIndex","candidates","used","q","matched","runAStar","graph","fromId","toId","accessibleOnly","start","goal","R","toRad","heuristic","a","b","dLat","dLng","s","heapIds","heapF","push","id","f","i","p","hf","cf","pid","cid","pop","top","lastId","lastF","l","r","smallest","fi","fl","fr","si","ii","sf","iff","gScore","cameFrom","closed","current","node","g","edge","neighbor","tentative","path","cursor","prev","_graph","_worker","_pending","_nextId","_cache","_RouteService","venue","__privateAdd","__privateSet","serializeGraph","source","runAStar","url","__privateGet","resolve","fromNodeId","toNodeId","options","accessibleOnly","key","cached","result","id","__privateWrapper","oldest","RouteService","graph","node","e","haversineMeters","lng1","lat1","lng2","lat2","toRad","dLat","dLng","a","_buildingsById","_floorsById","_locationsById","_shapesById","_nodesById","_categoriesById","_edgeCount","Venue","data","__privateAdd","__privateSet","b","__privateGet","f","c","n","s","l","id","buildVenue","nodes","rn","edgeCount","addEdge","from","to","cost","accessible","kind","e","sib","fc","start","end","categories","rc","cat","shapes","rs","shape","locations","rl","nodeFloor","shapeFloor","floorId","loc","locationByNodeId","nid","node","floorLocations","list","floorShapes","floorNodes","buildings","rb","rf","mapObjects","m","buildingIdForFloor","venue","floorId","bearingDeg","a","b","cosLat","bearingDelta","from","to","turnFor","delta","TURN_MIN_DEG","MAX_LEG_M","SNAP_M","TURN_PHRASE","formatMeters","m","buildRoute","path","names","nodes","id","n","segments","current","i","node","edge","e","landmarkByNode","loc","pts","cum","segment","segmentIndex","p","prev","haversineMeters","isSegmentEdge","direction","isTurn","next","stepIdx","pt","extras","k","run","parts","target","best","bestDiff","diff","lo","p0","p1","span","f","steps","x","y","deduped","step","buildingName","floorName","floorLevel","kind","phrase","at","where","PREVIEW_ZOOM","STEP_ZOOM","NAV_PITCH","RUN_MPS","TRANSITION_PAUSE_MS","PREVIEW_MIN_S","END_DWELL_MS","PREVIEW_MAX_S","VISITED_LERP","routePointAt","segments","meters","cum","segment","a","b","len","haversineMeters","t","last","p","routeSubpath","startMeters","endMeters","out","start","i","end","LEG_PADDING","LEG_MAX_ZOOM","frameLeg","map","pts","bearing","minLng","minLat","maxLng","maxLat","lng","lat","_map","_ribbon","_segments","_steps","_showFloor","_onStep","_repaint","_state","_onTransition","_transitions","_nextTransition","_pauseUntil","_pauseAt","_endDwellUntil","_currentStep","_visitedTarget","_revealStartMs","_revealSpeed","_raf","_NavigationController_instances","endPreview_fn","_tick","NavigationController","deps","__privateAdd","__privateGet","now","progress","elapsed","tr","boundary","trigger","__privateSet","__privateWrapper","head","lastStep","__privateMethod","current","nextValue","st","first","total","duration","step","index","j","nx","pv","nextStep","leg","framed","DIRECTION_GLYPH","createRouteBar","container","handlers","el","btn","label","onClick","danger","b","prev","next","clear","info","stepEl","glyphEl","actionEl","state","createVenueFacade","deps","venue","data","buildVenue","cause","message","createFloorsFacade","createSearchFacade","createRoutingFacade","createCameraFacade","ensureChipStyle","s","CHIP","ensureTransitionStyle","transitionArrowSvg","direction","transitionKindSvg","kind","k","_map","_emitter","_loaded","_abort","_container","_uiFloorSwitcher","_polygonTheme","_venueRenderer","_floorManager","_floorSwitcher","_venue","_searchIndex","_selected","_popupFollow","_hoveredId","_suppressPopupClose","_routeService","_nav","_startMarkerMove","_transitionCard","_transitionTimer","_uiTransitionCard","_routeBar","_uiRouteBar","_BecoMapImpl_instances","attachRenderer_fn","focusTo_fn","resolveAt_fn","handleClick_fn","handleHover_fn","select_fn","route_fn","showTransitionCard_fn","selectedFloorLevelForTransition_fn","clearRoute_fn","refreshSelectionVisibility_fn","applyChanges_fn","refreshSwitcher_fn","BecoMapImpl","container","options","__privateAdd","Emitter","createSearchFacade","text","__privateGet","categoryId","createRoutingFacade","from","to","__privateMethod","createCameraFacade","locationId","__privateSet","createVenueFacade","venue","createFloorsFacade","floorId","buildingId","maplibregl","e","cause","message","event","listener","theme","resolvePolygonTheme","location","_a","attach","VenueRenderer","FloorManager","SearchIndex","RouteService","createFloorSwitcher","anchor","node","geom","ring","frame","createFrame","cx","cy","polygonCentroid","ringToMeters","toLngLat","px","py","lng","lat","ground","resolveClick","id","ray","best","building","view","floor","f","locByShape","l","shape","h","storeHeight","t","hx","hy","hLng","hLat","pointInRing","target","p","hovered","roof","height","eff","popup","lastX","lastY","follow","scr","fromLocationId","toLocationId","result","built","buildRoute","ribbon","seg","startSeg","startPt2","startZ","startXY","startFloor","startLat","cosLat","applyStartView","bearing","pitch","mpp","b","pr","dir","base","tip","pxPerM","createRouteBar","NavigationController","info","toFloor","fromFloor","kindLabel","floorName","label","card","arrow","title","toFloorId","emit","hadRoute","visible","popupOnMap","changes","change","focusedId","createMap","assertContainer","CENTER","M_PER_DEG_LAT","metersToLngLat","dxEast","dyNorth","makeRng","seed","s","pointInPolygon","poly","x","y","inside","i","j","pi","pj","xi","yi","xj","yj","BUILDINGS","FLOOR_NAMES","PLAZA","ROW_H","CORR","VCORR_HALF","MARGIN","STORE_W_MIN","STORE_W_VAR","CATEGORY_SPECS","footprintOutline","spec","hw","hd","pts","flat","t","polygonGeometry","outlineMeters","ring","first","rectOutline","cx","cy","w","d","_seed","_stress","MockVenueProvider","options","__privateAdd","__privateSet","buildings","nodes","shapes","locations","floorConnections","link","b","outdoorFloorId","specs","plazaByTile","ti","__privateGet","tj","ox","oy","tileSuffix","plazaId","plazaNode","idHash","rngBase","outlineAbs","doorSide","building","elevatorNodeIds","f","rng","floorId","elevNode","rowPitch","yStart","yEnd","spineJunctions","storeIdx","ry","corrY","junction","halves","hx0","hx1","cursor","prevNode","frontY","sw","gap","depth","sx","scy","px","py","storeId","frontNode","cat","a","nearest","nearestDist","jn","doorY","doorNode","apronNode","endJunction","startNodeId","endNodeId","c","import_minimal","$Reader","$protobuf","$Writer","$util","$Object","$undefined","$Error","$root","com","beco","category","Category","properties","keys","message","writer","_depth","i","reader","length","_end","_target","end","value","start","tag","wireType","prefix","Color","CategoryList","location","Location","key","end2","tag2","Zone","Link","SiblingGroup","OperationHour","MapObject","LocationList","map_object","MapObjectsList","node","Node","NodeList","geoshapes","GeoShapes","GeoShapesList","HttpError","status","url","composeSignal","caller","timeout","backoff","attempt","base","jitter","resolve","request","options","lastError","response","err","fetchJson","fetchBinary","CONNECTION_KIND","parseShapeFeature","jsonData","parsed","geometry","geometryData","props","style","_options","RestVenueProvider","options","__privateAdd","__privateSet","signal","baseUrl","siteId","clientId","clientSecret","__privateGet","httpOptions","authed","fetchJson","site","floorLists","routeBin","shapeBin","locationBin","categoryBin","mapObjectBin","connections","iconset","b","fetchBinary","buildings","i","f","nodes","com","n","shapes","s","locations","l","loc","categories","c","cat","url","mapObjects","m","floorConnections","startNodeId","endNodeId"]}
|